【发布时间】:2016-06-26 11:35:20
【问题描述】:
我做了一个枚举:
enum class KeyPressSurfaces {
KEY_PRESS_SURFACE_DEFAULT,
KEY_PRESS_SURFACE_UP,
KEY_PRESS_SURFACE_DOWN,
KEY_PRESS_SURFACE_LEFT,
KEY_PRESS_SURFACE_RIGHT,
KEY_PRESS_SURFACE_TOTAL
};
后来我尝试在下面键入时定义一个数组,但我收到了错误,size of array 'KEY_PRESS_SURFACES' has non-integral type 'KeyPressSurfaces'
SDL_Surface*KEY_PRESS_SURFACES[KeyPressSurfaces::KEY_PRESS_SURFACE_TOTAL];
我理解错误很好,但我不知道将KeyPressSurfaces 移到哪里来限定枚举中的常量。
我也意识到我可以只使用enum 而不是enum class,但我觉得这应该可行,我想学习如何做到这一点。
有什么回应/建议吗?
【问题讨论】:
-
枚举是一个编译时间常数。
-
@user463035818 当您在枚举上添加更多项目时,
KEY_PRESS_SURFACE_TOTAL会自动调整。实际上,将枚举用于数组大小是一种很好的技术。当它是一个常数时,您必须编辑与该数组大小相关的代码中的所有部分,特别是在涉及数组大小的某些计算中。 -
我很惊讶没有其他人提到这一点:鉴于
enum classes 是作用域的,我认为它们的一半是为了避免你不得不重复像@987654330 这样的丑陋前缀@ 在每个枚举器上。您不再需要保护全局命名空间。认为你这样做,现在你必须写它两次...KeyPressSurfaces::KEY_PRESS_SURFACE_DEFAULTYuk!去掉前缀,去掉ALL_CAPS,因为这里没有宏,去掉IMO不必要且最好保留给集合实例的复数,然后写KeyPressSurface::default。好多了。 -
@underscore_d +1 除了
KeyPressSurface::default之外的所有内容,它根本无法编译。使用 Google 指南,您将改为编写KeyPressSurface::kDefault(google.github.io/styleguide/cppguide.html#Enumerator_Names) 之类的内容 -
在将值用作数组索引时,使用范围枚举而不是无范围枚举的充分理由是什么?如果是关于范围的,可以将无范围的枚举放入命名空间。