3

我正在寻找一些最佳实践建议。如果你有一个像这样在 C++ 中声明的类:

class Foo {
public:
    enum { A, B, MAX};
};

应该像这样访问枚举:

Foo::A

或者

Foo *var; 
var->A;

直到今天,我总是访问常量值Foo::A,而不是通过类类型的 ptr。事实上,我什至不相信这是可能的。有没有人遇到过何时以及是否应该使用每种表格,或者我应该坚持久经考验的Foo::A方法?

编辑:将 Foo var 变成 Foo *var 这是一个错字,因为大多数人都发现了谢谢。

4

3 回答 3

6

枚举与类相关联,而不是与实例相关联。所以Foo::A更好。

于 2012-12-04T17:26:19.377 回答
2

据推测,您的示例应该声明一个指针Foo * var或访问枚举器为var.A.

如果您没有可用的对象或指针,那么显然“类”形式Foo::A是唯一明智的选择。

如果你这样做,那么这两种形式是等价的。在我看来,“类”形式更具表现力,因为它与类而不是对象的关联匹配。它还可以避免与不相信它有效的人的争论。

在某些情况下(例如在模板中,或使用auto类型声明的对象),类名可能很复杂甚至未知,在这种情况下,“对象”形式会更好:

template <typename T>
void f()
{
    typename some::complicated::type::depending_on<T>::type var;
    var.thing = var.A;            // OK
    var.thing = decltype(var)::A; // Ugly, requires C++11
    var.thing = some::complicated::type::depending_on<T>::type::A; // Yuck!
}
于 2012-12-04T17:28:54.253 回答
1

第一个版本更好,就像@KevinA.Naude 说的那样。如果您正在寻找一种为您enum的.enum classenum class X {A, B, MAX};X::A

于 2012-12-04T17:31:37.530 回答