gpt4 book ai didi

c++ - 将枚举更改为下一个值 [C++11]

转载 作者:太空狗 更新时间:2023-10-29 19:40:18 25 4
gpt4 key购买 nike

我想做的是使用枚举轻松指定不同的绘制模式。到目前为止,这就是我所拥有的:

class Grid {
enum drawMode { GRID, EROSION, RIVERS, HUMIDITY, ATMOSPHERE }
drawMode activeDraw;

void draw() {
switch(activeDraw) {
case GRID:
drawGrid();
break;
case EROSION:
drawErosion();
break;
// etc..
}

void keyPressed(int key) {
switch(key) {
case ' ':
// Cycle activeDraw to next drawMode
}
}

因此,如果用户点击空格键,activeDraw 将更改为枚举中的下一个值。因此,如果当前 activeDraw 在按下空格后是 GRID,它将变为 EROSION,如果 activeDraw 是 ATMOSPHERE,它将变为 GRID。
有一个简单的解决方案吗?谢谢。

最佳答案

如 Maroš Beťko 所述,要将变量加 1,您必须将值转换为 int 并返回:

activeDraw = static_cast<drawMode>(static_cast<int>(activeDraw) + 1);

如果枚举是在没有 C++11 enum class 语法的情况下定义的(就像在问题的文本中一样),则不需要强制转换为 int:

activeDraw = static_cast<drawMode>(activeDraw + 1);

要使其循环回到零,请使用整数运算,模运算符:

activeDraw = static_cast<drawMode>((activeDraw + 1) % (ATMOSPHERE + 1));    

要消除一个丑陋的+1,向枚举中添加另一个元素:

enum drawMode { ..., ATMOSPHERE, NUM_DRAW_MODES };
...
activeDraw = static_cast<drawMode>((activeDraw + 1) % NUM_DRAW_MODES);

如果你经常使用它,你也可以把这段代码塞进一个operator++中:

drawMode operator++(drawMode& mode)
{
mode = static_cast<drawMode>((mode + 1) % NUM_DRAW_MODES);
return mode;
}

drawMode operator++(drawMode& mode, int) // postfix operator
{
drawMode result = mode;
++mode;
return result;
}

enum 的重载运算符很少使用,有些人认为它过大(不好),但它会使您的代码更短(并且可以说更干净)。

关于c++ - 将枚举更改为下一个值 [C++11],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40979513/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com