假设我们有一个枚举,如下所示:

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变量并进行比较:

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可以用作类型:

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;

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

Try:

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";
}

这将足以声明你的enum变量并进行比较:

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

遗憾的是,枚举的元素是“全局的”。你可以通过day = Saturday来访问它们。这意味着你不能有枚举A {A, b};and enum B {B, a};因为他们是相冲突的。

比起使用一堆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;
}