2012-04-10 110 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