【问题标题】:Referring to c++ enums [closed]参考c ++枚举[关闭]
【发布时间】:2014-09-10 06:08:28
【问题描述】:

在 c++11 中,引用类中定义的枚举的 c++“方式”(与 c 中使用的方式相反)是什么?例如

foo.BAR vs Foo::States::BAR

我一直使用后者,但在某些地方,前者可能同样有意义。

【问题讨论】:

  • “首选方式”是什么意思?
  • 我了解 c++ 向后兼容 c,所以想知道是否有特定的 c++ 方式
  • 通常当我在考虑枚举时,我在考虑类型。我想不出我希望枚举值看起来类似于成员变量的情况,因此我喜欢第二种语法。
  • 假设 States 是枚举,第二种方式仅在 C++11 gor 编译器提供语法作为扩展之后才有效),但 Foo::BAR 已经有效了几十年。跨度>
  • 为什么投反对票?这是一个有效的问题,与编码风格无关

标签: c++ enums


【解决方案1】:

出于几个原因,:: 的第二种方式肯定更可取。

从概念上讲,枚举真的很像类型,它们指定某个变量可以采用的值。不过,这不依赖于该变量的实例。如果您将枚举值放在一个类中,则您的枚举值不依赖于该类的实例。这样,它们的行为非常像静态成员。因此,出于这个原因,我会选择与静态成员一致的语法。

根据 c++ 标准,您可以使用 foo.BAR,但这种语法的通常含义会使代码不太清晰。看起来您实际上不是在尝试访问实例的成员。这种语法让我在真正应该考虑枚举值时考虑成员变量。

如果枚举在范围内,您也可以使用foo->BAR,但我认为这会使意图更加不明确。这种语法让我在真正应该考虑枚举值时考虑指针。

此外,如果您与其他程序员一起工作,他们会期望看到:: 访问枚举的方式。使用其他方式会让其他阅读您的代码的人更加困惑。

【讨论】:

    【解决方案2】:

    在所有版本的 C++ 中,使用范围语法的第二个版本 (Foo::States::BAR) 更传统,并且对于您的代码的未来维护者来说不会那么令人惊讶。由于该值是一个常量,因此不需要类的实例,因此这类似于最常使用范围语法而不是实例语法调用静态方法的方式。

    在实例上调用静态方法的一个动机可能是使其与非静态方法调用更相似(兼容),但这种动机在很大程度上与您的枚举示例无关,尤其是因为可能的未来将您的枚举更改为变量会使其看起来“错误”,即BAR 在所有大写字母中被大多数程序员理解为一个常量值,而不是一个变量,并且自 1970 年代以来一直如此。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多