在命名空间级别直接使用c ++中的枚举是不好的做法?我的意思是没有与任何课程相关联?假设我有一个enum和一个看起来像这样的类,
enum Player { USER, COMPUTER}
class Game {
//Logic of the game.
};
那么我应该宣布玩家枚举为游戏类的成员吗?它应该是私人的吗?
答案 0 :(得分:11)
这个答案最初写于2011年。现在C ++ 11支持广泛可用,首选方法是使用enum class
,正如Matthew D. Scholefield指出的那样:
enum class Player {
User,
Computer
};
枚举常量必须在引用时使用枚举的名称进行限定(例如Player::Computer
)。
不,枚举公开没有任何内在错误。但请记住,枚举常量不能使用封闭枚举类型的名称进行限定。也就是说,你不能写Player::USER
或类似的来引用USER
常数;它们直接出现在封闭的命名空间中。因此,为常量设置前缀可能是个好主意,这样就不会发生名称冲突。
例如,请考虑以下声明:
enum Player {
PL_USER,
PL_COMPUTER
}
这更安全,因为使用“PL_”前缀命名冲突的可能性要小得多。此外,它通过暗示给定常量属于哪个枚举来提高代码可读性。
C#和Java等语言对枚举采用了略微不同的方法,其中必须同时指定枚举的名称和常量的名称,例如Player.USER
。通过在自己的命名空间中嵌入枚举声明,可以在C ++中实现类似的效果。例如:
namespace Player {
enum Type {
USER,
COMPUTER
}
}
这具有在PLAYER
命名空间中嵌入COMPUTER
和Player
而不是全局(或封闭)命名空间的效果。在我看来,这是否是一种好的方法,是一个偏好的问题。
答案 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)
最好在命名空间
中定义枚举