博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
摘:C++ 枚举类型
阅读量:6002 次
发布时间:2019-06-20

本文共 1939 字,大约阅读时间需要 6 分钟。

C++ 中的枚举类型继承于 C 语言。就像其他从 C 语言继承过来的很多特性一样,C++ 枚举也有缺点,这其中最显著的莫过于作用域问题——在枚举类型中定义的常量,属于定义枚举的作用域,而不属于这个枚举类型。例如下面的示例:enum FileAccess {     Read = 0x1,     Write = 0x2,};FileAccess access = ::Read; // 正确FileAccess access = FileAccess::Read; // 错误C++枚举的这个特点对于习惯面向对象和作用域概念的人来说是不可接受的。首先,FileAccess::Read 显然更加符合程序员的直觉,因为上面的枚举定义理应等价于如下的定义(实际上,.NET 中的枚举类型便是如此实现的):class FileAccess {     static const int Read = 0x1;     static const int Write = 0x2;};其次,这导致我们无法在同一个作用域中定义两个同样名称的枚举值。也就是说,以下的代码是编译错误:enum FileAccess {     Read = 0x1,     Write = 0x2,};enum FileShare {     Read = 0x1, // 重定义     Write = 0x2, // 重定义};如果这一点没有让你恼怒过的话,你可能还没写过多少 C++ 代码 :-)。实际上,在最新的 C++0x 标准草案中有关于枚举作用域问题的提案,但最终的解决方案会是怎样的就无法未卜先知了,毕竟对于象 C++ 这样使用广泛的语言来说,任何特性的增删和修改都必须十分小心谨慎。当然,我们可以使用一些迂回的方法来解决这个问题(C++ 总是能给我们很多惊喜和意外)。例如,我们可以把枚举值放在一个结构里,并使用运算符重载来逼近枚举的特性:struct FileAccess {     enum __Enum {         Read = 0x1,         Write = 0x2     };     __Enum _value; // 枚举值     FileAccess(int value = 0) : _value((__Enum)value) {}     FileAccess& operator=(int value) {         this->_value = (__Enum)value;         return *this;     }     operator int() const {         return this->_value;     }};我们现在可以按照希望的方式使用这个枚举类型:FileAccess access = FileAccess::Read;并且,因为我们提供了到 int 类型的转换运算符,因此在需要 int 的地方都可以使用它,例如 switch 语句:switch (access) {     case FileAccess::Read:         break;     case FileAccess::Write:         break;}当然我们不愿意每次都手工编写这样的结构。通过使用宏,我们可以很容易做到这一点:#define DECLARE_ENUM(E) \struct E \{ \public: \     E(int value = 0) : _value((__Enum)value) { \     } \     E& operator=(int value) { \         this->_value = (__Enum)value; \         return *this; \     } \     operator int() const { \         return this->_value; \     } \\     enum __Enum {#define END_ENUM() \     }; \\private: \     __Enum _value; \};我们现在可以按如下的方式定义前面的枚举,并且不比直接写 enum 复杂多少。DECLARE_ENUM(FileAccess)     Read = 0x1,     Write = 0x2,END_ENUM()DECLARE_ENUM(FileShare)     Read = 0x1,     Write = 0x2,END_ENUM()

 

转载地址:http://fvbmx.baihongyu.com/

你可能感兴趣的文章
LNAMP第二版(nginx 1.2.0+apache 2.4.2+php 5.4)
查看>>
MongoDB repl set权限认证配置步骤
查看>>
java学习笔记(1)
查看>>
禁止Mysql默认端口访问Internet - MySQL - IT技术网
查看>>
基于用户投票的排名算法(二):Reddit
查看>>
下午最后的草坪
查看>>
Maven学习总结(七)——eclipse中使用Maven创建Web项目
查看>>
用PHP读取和编写XML DOM4
查看>>
1.部分(苹果)移动端的cookie不支持中文字符,2.从json字符串变为json对象时,只支持对象数组...
查看>>
vim配置及快捷键
查看>>
2018省赛赛第一次训练题解和ac代码
查看>>
UWP Composition API - 锁定列的FlexGrid
查看>>
[转载] win10进行端口转发
查看>>
利用JavaScript jQuery实现图片无限循环轮播(不借助于轮播插件)-----转载
查看>>
从零开始搭建vue项目 请求拦截器 响应拦截器
查看>>
HDU3257 Hello World!【打印图案+位运算】
查看>>
jquery 选择器
查看>>
The secret code
查看>>
Makefile 多目录自动编译
查看>>
学习笔记:Oracle dul数据挖掘 导出Oracle11G数据文件坏块中表中
查看>>