c++ - 枚举范围问题

标签 c++ scope enums

我尽量保持局部性,所以我把枚举放在类范围内,即使它们在两个类之间共享(我把它放在类中,用它“变得更好”。)这很有效, 但我最近遇到了一个问题,如果我将枚举放在类范围内,就会发生循环依赖。

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

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

最佳答案

从 C++11 开始,您可以使用 enum class(或 enum struct - 相同的东西,声明不同),其中枚举值的范围为枚举的名字。例如,这是一个有效的 C++11 声明。

enum class token_type {
    open_paren,
    close_paren,
    identifier
};

但是,要访问枚举的值,您必须使用 :: 运算符正确地限定它的范围。因此,这是 C++11 中的有效赋值:

token_type type = token_type::close_paren;

但这不是:

token_type type = close_paren;

这解决了命名冲突,意味着您不必使用容器命名空间或结构来阻止值范围泄漏到它们不应该泄漏的地方。这意味着以下枚举可以存在于与 token_type 相同的范围内:

enum class other_enum {
    block,
    thingy,
    identifier
};

现在两个不同结构中称为identifier 的两个值不会相互干扰。

关于c++ - 枚举范围问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1738260/

相关文章:

JavaScript - 单击图像,然后单击 div,然后将图像移动到 div

javascript - 从不同地方取消setInterval(NodeJS变量范围)

iphone - 检查 C 枚举是否存在

java - 反序列化 Enum,其中包含 Map

c++ - 不离开 for 循环,不知道为什么 [C++]

c++ - 在 Windows 上从 1_55 更新到 1_62 后,创建一个 boost::asio::ip::udp::socket 在 LIB 中崩溃

c++ - strstream 曾经是标准的一部分吗?

ruby-on-rails - 如何将当前模型保留在我的方法范围内

syntax - 有没有办法在 Kotlin 的数据类中嵌套枚举?

c++ - 当不使用指针来跟踪当前节点时,为什么树遍历会导致未定义的行为?