假设我们有一个枚举,如下所示:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
我想创建这个枚举的一个实例,并初始化它与一个适当的值,所以我做:
Days day = Days.Saturday;
现在我想用一个现有的enum值检查我的变量或实例,所以我这样做:
if (day == Days.Saturday)
{
std::cout << "Ok its Saturday";
}
这给了我一个编译错误:
错误:在`之前期望主表达式。“令牌
所以要明确的是,这两者的区别是什么
if (day == Days.Saturday) // Causes compilation error
and
if (day == Saturday)
?
这两个实际上指的是什么,一个是OK,一个导致编译错误?
如果我们想要严格的类型安全和有作用域的enum,在c++ 11中使用enum类是很好的。
如果我们必须在c++ 98中工作,我们可以使用InitializeSahib,San给出的建议来启用作用域enum。
如果我们还想要严格的类型安全,下面的代码可以实现类似enum的东西。
#include <iostream>
class Color
{
public:
static Color RED()
{
return Color(0);
}
static Color BLUE()
{
return Color(1);
}
bool operator==(const Color &rhs) const
{
return this->value == rhs.value;
}
bool operator!=(const Color &rhs) const
{
return !(*this == rhs);
}
private:
explicit Color(int value_) : value(value_) {}
int value;
};
int main()
{
Color color = Color::RED();
if (color == Color::RED())
{
std::cout << "red" << std::endl;
}
return 0;
}
代码修改自《Effective c++ 3rd: Item 18》一书中的Month类示例
这其中大部分应该会给您带来编译错误。
// note the lower case enum keyword
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };
现在,Saturday, Sunday等可以用作顶级裸常量,Days可以用作类型:
Days day = Saturday; // Days.Saturday is an error
类似地,后来,为了测试:
if (day == Saturday)
// ...
这些枚举值就像纯粹的常量——它们是无作用域的——在编译器的一点额外帮助下(除非你使用c++ 11枚举类):它们不像对象或结构成员那样被封装,并且你不能将它们引用为Days的成员。
你会得到你想要的c++ 11,它引入了一个枚举类:
enum class Days
{
SUNDAY,
MONDAY,
// ... etc.
}
// ...
if (day == Days::SUNDAY)
// ...
注意,这个c++在一些方面与C略有不同,一个是C在声明变量时要求使用enum关键字:
// day declaration in C:
enum Days day = Saturday;
这段代码是错误的:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)
因为Days既不是作用域,也不是对象。它是一种类型。类型本身没有成员。你所写的等价于std::string.clear。string是一种类型,所以不能使用。在上面。你用。在类的实例上。
不幸的是,枚举是神奇的,所以类比就到此为止了。因为对于类,你可以使用std::string::clear来获取成员函数的指针,但在c++ 03中,Days::Sunday是无效的。(这很可悲)。这是因为c++与C(在某种程度上)向后兼容,而C没有名称空间,因此枚举必须在全局名称空间中。语法很简单:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)
幸运的是,Mike Seymour发现c++ 11已经解决了这个问题。将enum更改为enum类,它将获得自己的作用域;所以Days::Sunday不仅有效,而且是访问Sunday的唯一方法。快乐的日子!