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

时间:2011-11-04 06:34:23

标签: c++ coding-style enums

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

enum Player { USER, COMPUTER}

class Game {
//Logic of the game.
};

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

6 个答案:

答案 0 :(得分:11)

使用C ++ 11

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

enum class Player {
    User,
    Computer
};

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

在C ++ 11之前

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

例如,请考虑以下声明:

enum Player {
  PL_USER,
  PL_COMPUTER
}

这更安全,因为使用“PL_”前缀命名冲突的可能性要小得多。此外,它通过暗示给定常量属于哪个枚举来提高代码可读性。

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

namespace Player {
  enum Type {
    USER,
    COMPUTER
  }
}

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

答案 1 :(得分:3)

通常使用最小范围。

这使得理解事物变得更容易。

然而,由于在课堂内外放置enum而导致的清晰度或缺乏与喊叫,使用 ALL UPPERCASE IDENTIFIERS <无关/ strong>即可。保留那些宏。在Java中,它们用于常量,因为Java从C中获得了它的外观和感觉,将常量定义为宏并不是那么罕见(因为早期的C没有const)。请注意,Java没有预处理器,也没有宏。采用一种源自C的约定,将宏保存在单独的“命名空间”中,并在不理解其他内容的情况下应用它,以便与原始意图完全交叉目的,这有点愚蠢。

干杯&amp;第h。,

答案 2 :(得分:2)

如果使用enum Player ......

  • 就在class Game内 - &gt;放入私人范围
  • class Game及其子类使用 - &gt;放入受保护的范围
  • class Game联系起来并在各个地方使用 - &gt;放 在公开范围
  • Game无关 - &gt;放入全局/命名空间范围

答案 3 :(得分:1)

这纯粹是一个偏好的问题;但是,我倾向于在C ++中使用类似Java的枚举:

class PlayerType {
  public:
     enum VALUE {USER, COMPUTER};
     explicit PlayerType(VALUE val) : value_(val) {}

     operator VALUE() const { return value_; }
     bool operator==(VALUE other) const { return value_ == other; }
     bool operator!=(VALUE other) const { return value_ != other; }
  private:
     VALUE value_;
     // Copy and assign intentionally allowed.
};

我倾向于这样做的原因是,稍后需要添加其他功能(例如转换为字符串表示或从字符串表示转换)并不常见,因此这种结构使其易于扩展。

答案 4 :(得分:0)

如果仅在Game类中使用它,我会把枚举放在其中。

答案 5 :(得分:-1)

最好在命名空间

中定义枚举