使用枚举作为数组索引

我有这个枚举:

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所处状态的颜色。

我的问题:

  1. 这是不错的编程风格? 有没有更好的方法来做到这一点? (我通常只使用开关语句枚举…使用枚举作为数组索引感觉不对。)
  2. 必须指定枚举的值吗? 它似乎从默认情况下从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>