如何在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.clear
。 std::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 };
现在, Saturday
, Sunday
等可以用作顶级裸常量, 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 ++中的枚举类似整数,当你声明枚举值(这不是一个定义只是一个提示是如何工作的)。
但是在你的代码中有两个错误:
- 拼写
enum
全部小写 - 你不需要
Days.
星期六之前。 - 如果这个枚举是在类中声明的,那么使用
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 ++书。