我正在研究一些类中有简单枚举的代码。另一段代码有一个指向该类的指针,并通过箭头指针访问枚举值。
该类如何以这种方式访问MY_VALUE1? 我虽然它只允许通过MyClass :: MY_VALUE1或MyClass :: MyEnum :: MY_VALUE1进行访问。
class MyClass {
public:
enum MyEnum{
MY_VALUE0 = 0,
MY_VALUE1 = 1
};
//getters, setters as appropriate
};
//Other class
MyClass* myClass = new MyClass();
//Compiles without C++11
if(getRandomEnum() == myClass->MY_VALUE1)
{
//Do Stuff
}
答案 0 :(得分:5)
->
运算符(大部分)是dereference
( * )和selection
(。)的缩写。换句话说,a->b
与(*(a)).b
相同。 (§5.2.5/ 2;见下面的注释)。
。语法是类成员访问,由§5.2.5[expr.ref]定义; 。右侧的标识符可以是静态或非静态数据成员,函数或成员枚举器(引用部分的第4段)。它不能是嵌套类型。从这个意义上讲,成员枚举数在语法上与static const
数据成员相似。
注意:
正如§13.5.6所阐明的那样,a->b
受运营商超载的影响。如果a
不是指针类型,则->
可能会重载,在这种情况下,表达式将被解释为(a.operator->())->b
。最终,重载->
调用的序列必须产生指针类型,此时应用§5.2.5/ 2的解释。
Class::member
和value.member
之间的一个重要区别是,在第二种情况下,value
将被评估,即使这不需要解析{的值{1}}
答案 1 :(得分:3)
来自C ++ ISO / IEC 2011
在类范围中声明的枚举器可以使用 类成员访问运算符(::,。(点)和 - >(箭头)),
答案 2 :(得分:2)
枚举值被视为静态成员
该类,可以通过两种方式访问:通过类
名称后跟范围解析运算符
(MyClass::MY_VALUE0
),或任何其他成员
(instance.MY_VALUE0
或pointer->MY_VALUE0
)。
请注意,在后一种情况下,左侧的操作数仍然是
评估,即使评估结果不是
用过的。换句话说,如果我写f()->MY_VALUE0
(其中f()
返回MyClass*
),函数将被调用,尽管如此
事实是它的返回值没有使用。