c ++中的命名空间级别枚举

Aja*_*jai 4 c++ enums coding-style

在命名空间级别直接使用c ++中的枚举是不好的做法?我的意思是没有与任何课程相关联?假设我有一个enum和一个看起来像这样的类,

enum Player { USER, COMPUTER}

class Game {
//Logic of the game.
};
Run Code Online (Sandbox Code Playgroud)

那么我应该宣布玩家枚举为游戏类的成员吗?它应该是私人的吗?

Mar*_*all 11

用C++ 11

这个答案最初写于2011年.现在C++ 11支持广泛可用,首选方法是使用enum class,正如Matthew D. Scholefield指出的那样:

enum class Player {
    User,
    Computer
};
Run Code Online (Sandbox Code Playgroud)

枚举常量必须在引用时使用枚举的名称进行限定(例如,Player::Computer).

在C++ 11之前

不,enum公开没有任何内在错误.但请记住,枚举常量不能使用封闭枚举类型的名称进行限定.也就是说,你不能写Player::USER或类似的引用USER常量; 它们直接出现在封闭的命名空间中.因此,为常量设置前缀可能是个好主意,这样就不会发生名称冲突.

例如,请考虑以下声明:

enum Player {
  PL_USER,
  PL_COMPUTER
}
Run Code Online (Sandbox Code Playgroud)

这更安全,因为名称冲突不太可能带有"PL_"前缀.此外,它通过暗示给定常量属于哪个枚举来提高代码可读性.

像C#和Java这样的语言对枚举采用了略微不同的方法,其中必须同时指定枚举的名称和常量的名称,例如Player.USER.通过在自己的命名空间中嵌入枚举声明,可以在C++中实现类似的效果.例如:

namespace Player {
  enum Type {
    USER,
    COMPUTER
  }
}
Run Code Online (Sandbox Code Playgroud)

这具有嵌入PLAYERCOMPUTERPlayer命名空间中而不是全局(或以其他方式封闭)命名空间的效果.在我看来,这是否是一种好的方法,是一个偏好的问题.

  • @Martin:我更喜欢`struct`,因为它引入了一个类型.这非常方便(例如你可以从中继承).一种类型不使用内存或任何东西:它是零成本. (2认同)
  • 请注意,将`enum`放在`namespace`或`struct`中不仅会将常量的名称放在名称空间或结构中,还会将类型的名称放在名称空间中.因此,如果客户端代码想要声明类型的变量,他必须编写`Player :: Type`,而不仅仅是`Type`.如果你有C++ 11,你可以使用`enum class Type`将枚举常量放入枚举本身的范围内(并禁止自动转换为`int`). (2认同)