Enum范围问题

Ano*_*ous 6 c++ enums scope

我尽量把事情保持在本地,所以我把枚举放在类范围内,即使它们在两个类之间共享(我把它放在"更好"的类中.)这很好,但是我最近遇到了一个问题,如果我把枚举放在类范围内,就会发生循环依赖.

枚举将成为多个类的构造函数参数,它所在的类(以及最适合它的类)包括这些类.因此,不可能将枚举用作包含的类的构造函数参数,因为它将导致循环依赖.

将这个枚举放在自己的头文件中会不会更好,如果是这样,我应该将头文件中的所有枚举保持一致吗?这个问题是否还有其他解决方案(这是合乎逻辑的)?

Tom*_*vin 14

从C++ 11开始,你可以使用enum class(或者enum struct- 同样的,以不同的方式声明),其中枚举值的范围限定为枚举的名称.例如,这是一个有效的C++ 11声明.

enum class token_type {
    open_paren,
    close_paren,
    identifier
};
Run Code Online (Sandbox Code Playgroud)

但是,要访问枚举的值,必须使用::运算符正确地对其进行范围调整.因此,这是C++ 11中的有效赋值:

token_type type = token_type::close_paren;
Run Code Online (Sandbox Code Playgroud)

但这不是:

token_type type = close_paren;
Run Code Online (Sandbox Code Playgroud)

这解决了命名冲突,意味着您不必使用容器命名空间或结构只是为了阻止值泄漏到不应该的位置.这意味着以下枚举可以存在于以下相同的范围内token_type:

enum class other_enum {
    block,
    thingy,
    identifier
};
Run Code Online (Sandbox Code Playgroud)

现在identifier,在两个不同结构中调用的两个值不会干扰.


Emi*_*ier 8

我使用Michael和Roger所做的变体:

namespace Color
{
   enum Type
   {
      red,
      green,
      blue
   };
};

void paintHouse(Color::Type color) {...}

main()
{
   paintHouse(Color::red);
}
Run Code Online (Sandbox Code Playgroud)

我觉得Color::TypeColor::Color或更漂亮,更自我记录COLOR::Color.如果你发现Color::Type太冗长,你可以使用Color::T.

我没有为枚举值添加前缀(即COLOR_RED),因为枚举周围的命名空间实际上成为前缀.

我已经停止对我的作用域常量使用ALL_CAPS约定,因为它们与C库中的宏发生冲突(例如NULL).宏未定义在它们定义的名称空间中.


dic*_*ice 4

如果枚举被多个类使用,那么我会说它并不真正属于单个类的定义,而是属于这些类所在的命名空间。

也就是说,除非枚举通过一个类传递到另一个类的构造函数,在这种情况下,单独实例化枚举依赖类并将其作为参数传递给包含类的构造函数可能更有意义。