2012-04-10 111 views
9

我有类似以下内容:通过访问向枚举值 '::' 在C++

class Car 
{ 
public: 
    Car(); 
    // Some functions and members and <b>enums</b> 
    enum Color 
    { 
     Red, 
     Blue, 
     Black 
    }; 
    Color getColor(); 
    void setColor(Color); 
private: 
    Color myColor; 
} 

我想:

  1. 访问ColorColor::Red。这实在是很难理解的代码时Car::Red时,上课时有很多枚举,子类等
  2. 利用类型Color作为函数参数或返回值
  3. 使用的变量类型Colorswitch

我知道3个部分解决方案:

  1. 在它
  2. 使用嵌入类Color和枚举使用嵌入式南协商Color和枚举它
  3. 使用enum class

1和2的解决方案解决了Color::Red加入的问题,但我不能使用功能,如Color getColor()void setColor(Color)

3解决方案有问题:VS2010不支持enum class。 GCC v.4.1.2也不支持它。我不知道更高版本的gcc。

是的,我正在开展跨平台项目。
我发现this解决方案,但它似乎...沉重。
我希望有人能帮助我在这里:)

+2

GCC 4。6(使用'-std = C++ 0x')支持'enum class',并且允许'Color :: Red'作为常规枚举。 – leftaroundabout 2012-04-10 14:48:30

+0

请注意,请使用4个空格缩进代码,而不是使用前/代码标记 – CharlesB 2012-04-10 14:51:29

+0

我发现,VS2010比**部分支持[强类型枚举](http://www.open-std.org/jtc1/ SC22/WG21 /文档/文件/ 2007/n2347.pdf)。 – Jury 2012-04-10 15:06:49

回答

13

在当前的C++(即C++ 11及以后),你可以已经访问枚举值这样的:

enum Color { Red }; 
Color c = Color::Red; 
Color d = Red; 

你可以更进一步,强制使用这不是通货膨胀:

enum class Color { Red }; 
Color c = Color::Red; 
// Color d = Red; <-- error now 

而且在阿里纳斯,你现在定义的基本类型,这在以前是唯一可能与哈克代码(FORCEDWORD左右的人?):

enum class Color : char { Red }; 
+0

你是对的,但没有完全支持C++ 11功能的编译器。是的,GCC 4.6和4.7支持它,但我的项目也必须为Windows编译。 VS2010不支持它。可能你知道它的一些补丁吗? – Jury 2012-04-10 16:19:00

+0

你可以试试MinGW,它是GCC的windows端口。 MSVC是封闭的源代码,并且没有补丁。 – 2012-04-11 09:24:02

7

名称的嵌套类中枚举(如例之一):

class Car 
{ 
public: 
    struct Color 
    { 
     enum Type 
     { 
      Red, 
      Blue, 
      Black 
     }; 
    }; 

    Color::Type getColor(); 
    void setColor(Color::Type); 
}; 
+1

您还可以提及'C++ 11'特性'enum class'。 – iammilind 2012-04-10 14:50:44

+0

并且在'Car'的getter和setter中使用'Color'的getter和setter? – Jury 2012-04-10 14:51:26

+0

'Color ::'部分在这里不需要? – Konrad 2012-04-10 14:52:01

5

当我想要做这样的事我倾向于使用一个命名空间和一个在命名空间之外的typedef(尽管通常我是在全局范围内而不是在类中)。事情是这样的:

namespace colors 
{ 
    enum Color 
    { 
     Red, 
     Blue 
     ... 
    } 
} 
typedef colors::Color Color; 

您使用的命名空间来获得在实际颜色这种方式,但Color类型本身仍然是全球可访问:

Color myFav = colors::Red; 
+0

VS2010:错误C2059:语法错误:'namespace'| GCC 4.1.2:错误:期望'命名空间'之前的非限定标识 – Jury 2012-04-10 15:00:49

+0

@Jury可能因为您不允许在类内部声明命名空间。就像我说的,我通常在全球范围内做这件事。如果你真的想把它保留在一个类中,你总是可以使用嵌套类 - 原理是一样的。 – obmarg 2012-04-10 15:26:28

+0

typedef并不是必须的,我只是将Color作为命名空间名称,而不是给枚举一个名称。由于它非常优雅,我一直使用命名空间方法。这里有一些关于使用枚举的更多信息:http://inphamousdevelopment.wordpress.com/2012/04/02/enumeration-and-arrays/ – alex 2012-04-17 13:40:48