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

Mar*_*ťko 3 c++ enums switch-statement c++11

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

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
      }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果用户点击空格键,activeDraw将从枚举更改为下一个值.因此,如果当前activeDraw是打空格后GRID它将改变糜烂,如果activeDraw是大气它将改变电网.
有一个简单的解决方案吗?谢谢.

ana*_*lyg 10

正如MarošBeťko所指出的,要为变量添加1,您必须将值转换为int和返回:

activeDraw = static_cast<drawMode>(static_cast<int>(activeDraw) + 1);
Run Code Online (Sandbox Code Playgroud)

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

activeDraw = static_cast<drawMode>(activeDraw + 1);
Run Code Online (Sandbox Code Playgroud)

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

activeDraw = static_cast<drawMode>((activeDraw + 1) % (ATMOSPHERE + 1));    
Run Code Online (Sandbox Code Playgroud)

为了消除丑陋+1,请在枚举中添加另一个元素:

enum drawMode { ..., ATMOSPHERE, NUM_DRAW_MODES };
...
activeDraw = static_cast<drawMode>((activeDraw + 1) % NUM_DRAW_MODES);
Run Code Online (Sandbox Code Playgroud)

operator++如果你经常使用它,你也可以将这些代码填入:

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

drawMode operator++(drawMode& mode, int) // postfix operator
{
    drawMode result = mode;
    ++mode;
    return result;
}
Run Code Online (Sandbox Code Playgroud)

enums的重载运算符很少使用,有些人认为它过度(不好),但它会使你的代码更短(并且可以说更清晰).


Jea*_*bre 5

由于您的枚举没有强制值,您可以“增加”它们,并在需要时对最后一项 + 1 执行取模以重置为第一项:

 activeDraw = drawMode((activeDraw+1) % (ATMOSPHERE+1));
Run Code Online (Sandbox Code Playgroud)

顺便说一句:也适用于 C 语言,稍作修改:

activeDraw = (activeDraw+1) % (ATMOSPHERE+1);
Run Code Online (Sandbox Code Playgroud)