假设我们有一个枚举,如下所示:
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,一个导致编译错误?
您正在寻找强类型枚举,这是c++ 11标准中提供的一个特性。它将枚举转换为具有作用域值的类。
使用您自己的代码示例,它是:
enum class 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。
比起使用一堆if语句,枚举更适合用于切换语句
我在游戏的关卡构建器中使用了一些枚举/开关组合。
编辑:另一件事,我看到你想语法类似;
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;
}
不要把enum看成一组对象,把它看成一个整数,其中每个数值都有一个名称,所以enum Days最好声明为enum Day。
如果你想把它包含在一个命名结构中,把enum Day放在一个结构Days中,就像这样:
struct Days{
enum Day{
Saturday,
Sunday,
Tuesday,
Wednesday,
Thursday,
Friday
};
};
然后您可以像这样称呼它们Days::Saturday,类型为Days::Day
如果我们想要严格的类型安全和有作用域的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类示例