首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在C++中使用枚举

如何在C++中使用枚举
EN

Stack Overflow用户
提问于 2012-08-30 01:02:24
回答 14查看 463.9K关注 0票数 237

假设我们有一个如下所示的enum

代码语言:javascript
复制
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};

我想创建此enum的一个实例,并使用适当的值对其进行初始化,因此我这样做了:

代码语言:javascript
复制
Days day = Days.Saturday;

现在我想用现有的enum值检查我的变量或实例,所以我这样做了:

代码语言:javascript
复制
if (day == Days.Saturday)
{
    std::cout << "Ok its Saturday";
}

这给了我一个编译错误:

错误:应为‘.’前的主表达式令牌

因此,明确地说,说:

代码语言:javascript
复制
if (day == Days.Saturday) // Causes compilation error

代码语言:javascript
复制
if (day == Saturday)

这两个实际上指的是什么,一个是正常的,一个是导致编译错误的?

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2012-08-30 01:26:53

这个代码是错误的:

代码语言:javascript
复制
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Days.Saturday;
if (day == Days.Saturday)

因为Days既不是作用域,也不是对象。它是一种类型。并且类型本身没有成员。您所写的内容等同于std::string.clearstd::string是一个类型,所以你不能对它使用.。您可以在类的实例上使用.

不幸的是,枚举是神奇的,所以类比到此为止。因为对于类,您可以执行std::string::clear来获取指向成员函数的指针,但在C++03中,Days::Sunday是无效的。(这是可悲的)。这是因为C++ (在某种程度上)与C向后兼容,而C没有名称空间,所以枚举必须在全局名称空间中。所以语法很简单:

代码语言:javascript
复制
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday)

幸运的是,Mike Seymour注意到C++11中已经解决了这个问题,将enum更改为enum class,它就有了自己的作用域;因此Days::Sunday不仅有效,而且是访问Sunday的唯一方法。快乐的日子!

票数 379
EN

Stack Overflow用户

发布于 2012-08-30 01:04:04

这足以声明枚举变量并对其进行比较:

代码语言:javascript
复制
enum Days {Saturday, Sunday, Tuesday, Wednesday, Thursday, Friday};
Days day = Saturday;
if (day == Saturday) {
    std::cout << "Ok its Saturday";
}
票数 26
EN

Stack Overflow用户

发布于 2012-08-30 01:07:12

这其中的大部分应该会给你带来编译错误。

代码语言:javascript
复制
// note the lower case enum keyword
enum Days { Saturday, Sunday, Monday, Tuesday, Wednesday, Thursday, Friday };

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

代码语言:javascript
复制
Days day = Saturday;   // Days.Saturday is an error

类似地,稍后要测试:

代码语言:javascript
复制
if (day == Saturday)
    // ...

这些枚举的值就像赤裸裸的常量-它们没有作用域-通过编译器的一些额外帮助:(除非您正在使用C++11枚举类),它们不像对象或结构成员那样被封装,并且您不能将它们引用为Days的成员。

通过引入enum classC++11,您将获得您想要的东西

代码语言:javascript
复制
enum class Days
{
    SUNDAY,
    MONDAY,
    // ... etc.
}

// ...

if (day == Days::SUNDAY)
    // ...

请注意,此C++在几个方面与C略有不同,其中之一是C在声明变量时需要使用enum关键字:

代码语言:javascript
复制
// day declaration in C:
enum Days day = Saturday;
票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12183008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档