将枚举更改为下一个值 \[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
      }
}

因此,如果用户按空格键,则 activeDraw 将从枚举更改为下一个值。因此,如果当前的 activeDraw 在击中空间后是 GRID,它将更改为 EROSION,如果 activeDraw 是 ATMOSPHERE,它将更改为 GRID。

有一个简单的解决方案吗?谢谢。

原文由 Maroš Beťko 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 951
2 个回答

正如 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 s 的重载运算符很少使用,有些人认为它矫枉过正(不好),但它会使您的代码更短(并且可以说更简洁)。

原文由 anatolyg 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

  activeDraw = drawMode((activeDraw+1) % (ATMOSPHERE+1));

顺便说一句:也可以在 C 语言中稍作修改:

 activeDraw = (activeDraw+1) % (ATMOSPHERE+1);

原文由 Jean-François Fabre 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题