使用枚举作为数组索引
我有这个枚举:
enum ButtonState { BUTTON_NORMAL = 0, BUTTON_PRESSED = 1, BUTTON_CLICKED = 2 }; const u8 NUM_BUTTON_STATES = 3;
在我的Button类中,我有成员variablesButtonState state;
和ButtonColors colors[NUM_BUTTON_STATES];
。 在绘制button时,我使用colors[state]
来获取button所处状态的颜色。
我的问题:
- 这是不错的编程风格? 有没有更好的方法来做到这一点? (我通常只使用开关语句枚举…使用枚举作为数组索引感觉不对。)
- 我必须指定枚举的值吗? 它似乎从默认情况下从0开始,并增加1,但它是保证在所有编译器中以这种方式工作?
这是不错的编程风格?
我想是这样。 我经常做同样的事情。
有没有更好的方法来做到这一点?
class Button { public: // Used for array indexes! Don't change the numbers! enum State { NORMAL = 0, PRESSED, CLICKED, NUMBER_OF_BUTTON_STATES }; };
缺点是NUMBER_OF_BUTTON_STATES现在是一个有效的Button :: State值。 如果您将这些值作为整数传递,那么不是一个大问题。 但麻烦,如果你实际上期待一个Button ::状态 。
使用枚举作为数组索引感觉不对。
没关系。 只是logging它,所以下一个人知道发生了什么事! (这是什么意见。)
我必须指定枚举的值吗?
没有'='赋值,枚举应该从零开始向上递增。
如果一个枚举项有一个“=”赋值,那么后面的非“=”枚举项继续从那里计数。
来源:带注释的C ++参考手册 ,第113页
也就是说,我想指定初始值只是为了使代码更清晰。
是的,它会运作良好。 也就是说,无论如何,你真的应该在枚举中join另一个条目来定义项目数量的值:
enum ButtonState { BUTTON_NORMAL, BUTTON_PRESSED, BUTTON_CLICKED, STATE_COUNT };
然后你可以像这样定义数组
Color colors[STATE_COUNT];
否则,保持与数组大小同步的状态量是一团糟。 枚举将始终从零开始,如果没有以其他方式初始化,则每个附加条目将被分配一个高于前一个值的值,否则将被初始化。 当然,如果你愿意的话,你也可以明确的设置一个零。 如果你不介意附加的代码,我会使用一个函数来包装访问原始数组
Color & operator[](ButtonState state) { return array[state]; }
或转发请求的等效getColor
函数。 这将禁止直接索引数组的一些整数,这几乎肯定会在某个时候失败,因为索引是错的。
使用枚举是好的。 但是您不必为每个项目指定值。 指定第一个值就足够了。 我不会假设枚举从0开始,因为我使用了使用1作为起始值的编译器(不适用于PC,但某些编译器对于微控制器有一些奇怪的行为)。 另外,你可以摆脱const:
enum ButtonState { BUTTON_NORMAL = 0, BUTTON_PRESSED, BUTTON_CLICKED, NUM_BUTTON_STATES };
问题1:我认为这是很好的编程风格。 我用它所有的时间。 问题2:据我所知,保证这样工作,所以你不必指定值。
我也会把NUM_BUTTON_STATES放入枚举中。
风格上,这很好。
像Delphi这样基于Pascal的语言允许将数组边界指定为枚举types,因此只能使用该特定types的项作为索引。
使用枚举来索引数组是非常正常的。
您不必指定每个枚举值,它们会自动递增1.让编译器select这些值会降低错误和创build错误的可能性,但会剥夺您查看值的可能性,这在debugging时可能会有用。
没关系,但是我想要在数组上进行一些边界检查,就好像有人添加了另一个ButtonState一样,你将会遇到问题。
此外,颜色数组的元素是不可变的,所以也许看看使用不同的集合数组,以便您可以强制执行不变性。 也许一个Dictionary<ButtonState,ButtonColor>