假设我们有一个 enum
,如下所示:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
我想创建这个 enum
的一个实例并用适当的值对其进行初始化,所以我这样做了:
Days day = Days.Saturday;
现在我想用现有的 enum
值检查我的变量或实例,所以我这样做了:
if (day == Days.Saturday)
{
std::cout << "Ok its Saturday";
}
这给了我一个编译错误:
error: expected primary-expression before ‘.’ token
所以要清楚,说之间有什么区别:
if (day == Days.Saturday) // Causes compilation error
和
if (day == Saturday)
?
这两个实际上指的是什么,一个是好的,一个会导致编译错误?
最佳答案
这段代码是错误的:
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)
因为 Days
不是范围,也不是对象。它是一种类型。并且类型本身没有成员。你写的相当于std::string.clear
。 std::string
是一个类型,所以你不能在它上面使用 .
。你在一个类的 instance 上使用 .
。
不幸的是,枚举是神奇的,所以类比就到此为止了。因为有了一个类,你可以做 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 class
并获得自己的范围;所以 Days::Sunday
不仅有效,而且是访问 Sunday
的唯一 方式。快乐的时光!
关于c++ - 如何在 C++ 中使用枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12183008/