C++ 类内的枚举

C++ 类内的枚举,c++,C++,假设我有一个C类,它有一个属性状态,它可以取下值、平值或向上值。与其将状态变量表示为整数,不如使用枚举(ofc基本上是整数)。比如说, class C{ public: enum state {down = -1, flat = 0, up = 1}; C(state s = flat) : st(s) {} private: state st; }; 将枚举放在类的公共部分内的原因是,其他对象也可以使用此枚举列表。他们必须打电话 C::up 以向上检索值。我的问题是

假设我有一个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

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

如果枚举在语义上只在类的上下文中有意义,那么将其保存在内部是完全自然的。如果它具有全局意义,那么它应该在类之外。在任何情况下,枚举的位置都应该反映正在开发的系统的语义


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

我同意,至少把它放在一个名称空间中(这基本上就是我们通过把它放在类定义的公共部分来实现的)感觉最好。就像你说的,为了避免自由浮动枚举。啊,这其实很好。