我正在寻找一些最佳实践建议。如果你有一个用C ++声明的类,那么:
class Foo {
public:
enum { A, B, MAX};
};
是否应该像以下一样访问枚举:
Foo::A
或
Foo *var;
var->A;
直到今天,我总是访问Foo::A
之类的常量值,而不是通过类类型的ptr。事实上,我甚至不相信这是可能的。有没有人遇到过何时以及是否应该使用每个表格,还是应该坚持使用久经考验的Foo::A
方法?
答案 0 :(得分:6)
枚举与类相关联,而不是与实例相关联。所以Foo::A
更好。
答案 1 :(得分:2)
据推测,您的示例应该声明指针Foo * var
或以var.A
的形式访问枚举器。
如果你没有可用的对象或指针,那么显然“class”形式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!
}
答案 2 :(得分:1)
第一版更好,就像@ KevinA.Naude所说。如果您正在寻找一种方法来为enum
设置范围,您可能需要查看C ++ 11 enum class
,它允许您使用enum class X {A, B, MAX};
等强制执行的结构范围 - 您需要X::A
来引用它的内部。