类中的枚举

Enumerations within classes

本文关键字:枚举      更新时间:2023-10-16

假设我有一个类C,它有一个属性状态,可以取下、持平或向上的值。我们可以使用枚举来代替将状态变量表示为整数(ofc基本上是整数)。例如,

class C{
public:
    enum state {down = -1, flat = 0, up = 1};
    C(state s = flat) : st(s) {}
private:
    state st;
};

将枚举放入类的公共部分的原因是,其他对象也可以使用此枚举列表。他们必须打电话给

C::up

以向上检索值。我的问题是:将枚举声明放在类定义内部或外部(例如,直接放在它上面)是否是"最佳实践"?如果枚举表示的值/状态只对该类有意义,那么将其放在类定义中会感觉很直观。

谢谢。

您很可能不想要自由浮动枚举-它们应该在类或命名空间中。如果枚举只在特定的类中有意义,那么最好的做法可能是把它放在里面——我相信SFML的事件就有一个这样的例子(sf::Event有一个类型为sf::Event::EventType的成员,它可以取sf::Event::KeyPressed等值)。

若一个枚举在语义上只在类的上下文中有意义,那么把它放在里面是完全自然的。如果它具有全局意义,那么它应该在类之外。在任何情况下,枚举的位置都应该反映正在开发的系统的语义。

因此,我完全同意你最后的几句话。

如果使用C++11,则可以使用强类型枚举。这些是形式:

enum class state
//     ^
{
    Down, Flat, Up
};

您现在可以使用访问这些

state::Down
state::Flat
state::Up

请注意,这需要您限定/using元素,这始终是一种良好的做法。然而,并不是说这些枚举是类型安全的,所以不能任意用作整数(您可能无论如何都不应该这样做)。