簡體   English   中英

在 C++ 中通過 '::' 訪問枚舉值

[英]Accessing to enum values by '::' in C++

我有 class 如下所示:

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. 訪問Color值作為Color::Red 當使用Car::Red時,當 class 有很多枚舉、子類等時,真的很難理解代碼。
  2. 使用類型Color作為 function 參數或返回值
  3. switch中使用變量類型Color

我知道 3 個部分解決方案:

  1. 在其中使用嵌入式 class Color和枚舉
  2. 在其中使用嵌入式命名空間Color和枚舉
  3. 使用enum class

1 和 2 解決方案解決了Color::Red加入問題,但我不能使用像Color getColor()void setColor(Color)這樣的函數。

3 解決方案有一個問題:VS2010 不支持enum class GCC v.4.1.2 也不支持。 不知道gcc以后的版本。

是的,我正在從事跨平台項目。
我找到了這個解決方案,但它似乎......很重。
我希望有人能在這里幫助我:)

在當前的 C++(即 C++11 及以后)中,您已經可以像這樣訪問枚舉值:

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

您可以進一步 go 並強制使用此表示法:

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

在旁注中,您現在定義了基礎類型,這在以前只能使用駭人聽聞的代碼( FORCEDWORD或其他任何人?):

enum class Color : char { Red };

在嵌套的 class 中命名枚舉(例如一個):

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

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

當我想做這樣的事情時,我傾向於在命名空間之外使用一個命名空間和一個 typedef(盡管我通常是在全局而不是在一個類中這樣做)。 像這樣:

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

通過這種方式,您可以使用命名空間獲取實際的 colors,但Color類型本身仍然可以全局訪問:

Color myFav = colors::Red;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM