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的重载运算符很少使用,有些人认为它过度(不好),但它会使你的代码更短(并且可以说更清晰).
由于您的枚举没有强制值,您可以“增加”它们,并在需要时对最后一项 + 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)
| 归档时间: |
|
| 查看次数: |
5678 次 |
| 最近记录: |