如何在C ++中使用枚举

假设我们有如下的enum

 enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; 

我想创build一个这个enum的实例,并用适当的值初始化它,所以我做:

 Days day = Days.Saturday; 

现在我想检查我的variables或实例与现有的enum值,所以我这样做:

 if (day == Days.Saturday) { std::cout<<"Ok its Saturday"; } 

这给了我一个编译错误:

错误:预期在''之前的主expression式。 代币

所以要说清楚,有什么区别说:

 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) 

因为天不是范围,也不是对象。 这是一种types。 types本身没有成员。 你写的东西等同于std::string.clearstd::string是一个types,所以你不能使用. 在上面。 你用. 在一个类的实例

不幸的是,枚举是不可思议的,因此类比停在那里。 因为有了类,你可以通过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 class ,它有自己的范围; 所以Days::Sunday不仅是有效的,而且是访问Sunday唯一途径。 快乐的时光!

这将足以声明你的枚举variables并比较它:

 enum Days { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday}; Days day = Saturday; if(day == Saturday){ std::cout<<"Ok its Saturday"; } 

这大部分应该给你编译错误。

 // note the lower case enum keyword enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday }; 

现在, SaturdaySunday等可以用作顶级裸常量, Days可以用作types:

 Days day = Saturday; // Days.Saturday is an error 

同样的后来,testing:

 if (day == Saturday) // ... 

这些enum值就像常量 – 它们没有被放大 – 在编译器中有一点额外的帮助:(除非你使用C ++ 11 枚举类 ),它们并不像对象或结构成员那样封装,你不能把他们称为Days 成员

C ++ 11将引入一个enum class

 enum class Days { SUNDAY, MONDAY, // ... etc. } // ... if (day == Days::SUNDAY) // ... 

请注意,这个C ++与C有一些不同之处,一是C在声明一个variables时需要使用enum关键字:

 // day declaration in C: enum Days day = Saturday; 

你可以按照你的意思使用范围,只需要以这样的方式声明枚举:

 struct Days { enum type { Saturday,Sunday,Tuesday,Wednesday,Thursday,Friday }; }; Days::type day = Days::Saturday; if (day == Days::Saturday) 

枚举不是使用一堆if语句,而是使用枚举来切换语句

我在我为游戏构build的关卡生成器中使用了一些枚举/开关组合。

编辑:另一件事,我看到你想要的语法类似于;

 if(day == Days.Saturday) etc 

你可以在C ++中做到这一点:

 if(day == Days::Saturday) etc 

这是一个非常简单的例子:

EnumAppState.h

 #ifndef ENUMAPPSTATE_H #define ENUMAPPSTATE_H enum eAppState { STARTUP, EDIT, ZONECREATION, SHUTDOWN, NOCHANGE }; #endif 

Somefile.cpp

 #include "EnumAppState.h" eAppState state = eAppState::STARTUP; switch(state) { case STARTUP: //Do stuff break; case EDIT: //Do stuff break; case ZONECREATION: //Do stuff break; case SHUTDOWN: //Do stuff break; case NOCHANGE: //Do stuff break; } 

这不应该在C ++中工作:

 Days.Saturday 

天不是包含可以使用点运算符访问的成员的范围或对象。 这个语法只是一个C#主义,在C ++中是不合法的。

微软长久以来一直保持C ++扩展,允许你使用范围操作符访问标识符:

 enum E { A, B, C }; A; E::B; // works with Microsoft's extension 

但是这在C ++ 11之前是非标准的。 在C ++ 03中,在枚举中声明的标识符只存在于与枚举types本身相同的范围内。

 A; E::B; // error in C++03 

C ++ 11使枚举标识符具有枚举名称的合法性,并引入了枚举类,这些类为标识符创build一个新的作用域,而不是将它们放在周围的作用域中。

 A; E::B; // legal in C++11 enum class F { A, B, C }; A; // error F::B; 

可悲的是,枚举的元素是“全局”的。 你可以在day = Saturday进行访问。 这意味着你不能enum A { a, b } ;enum B { b, a } ; 因为他们有冲突

C ++中的枚举类似整数,当你声明枚举值(这不是一个定义只是一个提示是如何工作的)。

但是在你的代码中有两个错误:

  1. 拼写enum全部小写
  2. 你不需要Days. 星期六之前。
  3. 如果这个枚举是在类中声明的,那么使用if (day == YourClass::Saturday){}

我认为你的根本问题是使用. 而不是:: ,它将使用命名空间。

尝试:

 enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday}; Days day = Days::Saturday; if(Days::Saturday == day) // I like literals before variables :) { std::cout<<"Ok its Saturday"; } 

虽然C ++(不包括C ++ 11)具有枚举,但它们中的值被“泄漏”到全局名称空间中。
如果你不想让它们泄漏(不需要使用枚举types),请考虑以下几点:

 class EnumName { public: static int EnumVal1; (more definitions) }; EnumName::EnumVal1 = {value}; if ([your value] == EnumName::EnumVal1) ... 

您正在寻找强types枚举 ,这是C ++ 11标准中的一个特性。 它将枚举变成具有范围值的类。

使用您自己的代码示例,它是:

  enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; Days day = Days::Saturday; if (day == Days::Saturday) { cout<<" Today is Saturday !"<<endl; } //int day2 = Days::Sunday; // error ! invalid 

如果以C ++ 11之前的C ++标准为目标,则使用::作为枚举访问器将会失败。 但是一些旧的编译器不支持它,以及一些IDE只是覆盖这个选项,并设置一个旧的C ++ std。

如果您使用的是gcc,请使用-std = c ++ 11-std = gnu11启用C + 11。

要开心 !

如果您仍在使用C ++ 03并想要使用枚举,则应该在名称空间内使用枚举。 例如:

 namespace Daysofweek{ enum Days {Saturday, Sunday, Tuesday,Wednesday, Thursday, Friday}; } 

你可以使用命名空间之外的枚举,

 Daysofweek::Days day = Daysofweek::Saturday; if (day == Daysofweek::Saturday) { std::cout<<"Ok its Saturday"; } 

首先,将枚举'E'作为小写字母'e'。

其次,在“Days.Saturday”中放置types名称“Days”。

第三…给自己买一本好的C ++书。