我见过有人写这样的代码......最重要的是......
class Test
{
public:
struct MethodEnum
{
enum Enum
{
Method1,
Method2
};
};
};
答案 0 :(得分:4)
在pre-C ++ 11中,enum
的标签不是作用域的(这意味着标签可以在没有enum
类型的任何限定的情况下访问!)。因此,为了使它们作用域,程序员编写了这些代码。但是在C ++ 11中,不需要它,因为你可以使用enum class
来定义scoped-enum。
所以在C ++ 11中,你的代码看起来像这样:
class Test
{
public:
enum class MethodEnum
{
Method1,
Method2
};
};
答案 1 :(得分:1)
如果在同一作用域中定义了多个枚举类型,并且其中两个枚举类型具有相同名称的枚举,则会发生冲突。此技术将名称放在单独的范围中,可以通过将名称放在单独的范围内来避免这种冲突。这样,在Test
的成员函数中,您将枚举器称为MethodEnum::Method1
等。
在C ++ 11中,您可以使用enum class
获取范围名称。
答案 2 :(得分:1)
有时,您不希望调查员污染周围的范围;例如
enum Colour {
Red,
Yellow,
Orange
};
enum Fruit {
Apple,
Physalis,
Orange // ERROR! already defined
};
你的例子是将它们封闭在范围内的老式方法;最近,我们使用了枚举(enum class
)来更方便地完成这项工作。
答案 3 :(得分:0)
它设置MethodEnum和枚举之间的逻辑(或语义)链接。例如,你可以写
switch ( SomeExpression )
{
case Test::MethodEnum::Method1
// do some method1
break;
case Test::MethodEnum::Method2
/ do some method2
break;
default:
std::cout << "There is no such a method" << std::endl;
break;
}