在命名空间级别直接在 C++ 中使用枚举是一种不好的做法吗?我的意思是不与任何课程相关联?假设我有一个枚举和一个看起来像这样的类,
enum Player { USER, COMPUTER}
class Game {
//Logic of the game.
};
那么我应该将 Player 枚举声明为游戏类的成员吗?它应该是私人的吗?
原文由 Ajai 发布,翻译遵循 CC BY-SA 4.0 许可协议
在命名空间级别直接在 C++ 中使用枚举是一种不好的做法吗?我的意思是不与任何课程相关联?假设我有一个枚举和一个看起来像这样的类,
enum Player { USER, COMPUTER}
class Game {
//Logic of the game.
};
那么我应该将 Player 枚举声明为游戏类的成员吗?它应该是私人的吗?
原文由 Ajai 发布,翻译遵循 CC BY-SA 4.0 许可协议
这纯粹是一个偏好问题;但是,我倾向于在 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.
};
我倾向于这样做的原因是,稍后需要添加额外的功能(例如与字符串表示形式之间的转换)并不少见,因此这种结构使其易于扩展。
原文由 Michael Aaron Safyan 发布,翻译遵循 CC BY-SA 3.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
使用 C++11
这个答案最初是在 2011 年编写的。现在 C++11 支持已广泛使用,首选方法是使用
enum class
,正如 Matthew D. Scholefield 指出的那样:枚举常量在引用时必须使用枚举名称进行限定(例如,
Player::Computer
)。C++11 之前
不,公开的枚举本身并没有错。但是请记住,枚举常量不能用封闭枚举类型的名称来限定。也就是说,你不能写
Player::USER
或类似的来引用USER
常量;它们直接出现在封闭的命名空间中。因此,为常量设置前缀可能是个好主意,这样就不会发生名称冲突。例如,考虑以下声明:
这更安全,因为带有“PL_”前缀的名称冲突的可能性要小得多。此外,它通过提示给定常量属于哪个枚举来提高代码可读性。
像 C# 和 Java 这样的语言对枚举采用了稍微不同的方法,其中必须同时指定枚举的名称和常量的名称,例如
Player.USER
。在 C++ 中可以通过将枚举声明嵌入到它自己的命名空间中来实现类似的效果。例如:这具有将
PLAYER
和COMPUTER
嵌入到Player
命名空间而不是全局(或其他封闭)命名空间中的效果。在我看来,这是否是一个好方法是一个偏好问题。