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

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++中是行不通的:

Days.Saturday

Days不是包含可以用点操作符访问的成员的作用域或对象。这种语法只是c#主义,在c++中是不合法的。

微软长期以来维护了一个c++扩展,允许您使用作用域操作符访问标识符:

enum E { A, B, C };

A;
E::B; // works with Microsoft's extension

但这在c++ 11之前是不标准的。在c++ 03中,在enum中声明的标识符只存在于与enum类型本身相同的范围内。

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

c++ 11允许用enum名称限定enum标识符,并且还引入了enum类,这些类为标识符创建了一个新的作用域,而不是将它们放在周围的作用域中。

A;
E::B; // legal in C++11

enum class F { A, B, C };

A; // error
F::B;

其他回答

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

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

如果您仍在使用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";
}

您正在寻找强类型枚举,这是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;
}

首先,让“E”在enum中,“E”为小写。

其次,在“Days. saturday”中输入名称“Days”。

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