参考c ++枚举

时间:2014-07-19 02:46:18

标签: c++ enums

在c ++ 11中,什么是c ++"方式" (与c中使用的相反)引用类中定义的枚举? E.g

foo.BAR vs Foo::States::BAR

我一直使用后者,但在某些地方,前者可能会有所帮助。

2 个答案:

答案 0 :(得分:7)

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

在一个实例上调用静态方法的一个动机可能是使它与非静态方法调用更相似(兼容),但这种动机在很大程度上与你的枚举实例无关,尤其是因为可能的未来更改为使你的枚举变成一个变量会使它看起来“错误”,即所有大写的BAR被大多数程序员理解为一个恒定的值,而不是一个变量,并且它一直是这样的,因为也许是1970年代的

答案 1 :(得分:2)

第二种方式::绝对是可取的,原因有几个。

概念上,枚举非常类似,它们指定某个变量可以采用的值。但这并不取决于该变量的实例。如果将枚举值放在类中,则枚举值不依赖于类的实例。以这种方式,他们的行为非常像静态成员。因此,我会选择静态成员一致的语法。

根据c ++标准,您可以使用foo.BAR,但此语法的通常含义使代码不太清晰。当你真的没有时,看起来你正试图访问一个实例的成员。这个语法让我在考虑枚举值的时候考虑成员变量。

如果枚举在范围内,您也可以使用foo->BAR,但我认为这使得意图更加清晰。这个语法让我在考虑枚举值的时候考虑指针。

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