2013-01-11 138 views
0

我有幾個類,他們每個人都使用相同的enum,但擴展它的一點,根據其要求。 例如:#define枚舉或如何擴展枚舉

class skirtColor{ 
    enum Color{ 
red = 1, 
blue = 10, 
green = 12 
}; 
}; 
class dressColor { 
enum Color{ 
red = 1, 
pink, 
yellow, 
blue = 10, 
green = 12 
}; 
}; 
class pantsColor { 
enum Color { 
red = 1, 
brown, 
blue = 10, 
green = 12 
}; 
}; 

由於沒有繼承在C++枚舉,我想用define爲共同的一部分

#define COLOR\ 
// red color \ 
red = 1,\ 
// blue color \ 
blue = 10,\ 
//green color 
green = 12, 

後,我可以在類

重用共用顏色定義
class skirtColor{ 
    enum Color{ 
COLOR 
}; 
}; 
class dressColor { 
enum Color{ 
COLOR 
pink = 2, 
yellow, 
}; 
}; 
Class pantsColor { 
enum Color { 
COLOR 
brown = 2, 
}; 
}; 

這樣可以嗎? 我無法編譯此代碼,你可以幫助我正確的宏定義?

回答

0

http://ideone.com/Q2mIRk

Color是不一樣的COLOR這裏:

Enum Color{ 
Color 
Pink = 2, 
yellow, 
}; 

此外,它enumclass,全部小寫。

此外,溝的評論:

#define COLOR\ 
// red color \ 
red = 1,\ 
// blue color \ 
blue = 10,\ 
//green color 
green = 12, 

因爲尾隨\會讓一切都變成註釋。以上將擴大到:

// red color red = 1, // blue color blue = 10, //green color green = 12, 

只是說

#define COLOR \ 
red = 1,\ 
blue = 10,\ 
green = 12, 

,如果有一個人是無法弄清楚red代表什麼顏色......嗯,我就繼續我的嘴。

+0

大寫當你使用MS-Word編寫C(呃!)時,會發生一些事情。 – rodrigo

+0

@Luchian Grigore - rodrigo是對的 - 我確定 – Yakov

5

目前管理這種事情的一種方法是繼承,它將繼承類的常量。

struct Color 
{ 
    enum { red = 1, blue = 10, green = 12 }; 
} ; 

struct DressColor : Color 
{ 
    enum { pink =2, yellow = 3 }; 
}; 

和DressColor也會有紅色,藍色和綠色..

如果要啓用「嚴格鍵入」有必須具有下列值之一,你可以用一個類來完成這一個變量該「具有」一個價值,並且只能在課堂內構建或修改。

struct Color 
{ 
    class Holder 
    { 
     private: 
     int value; 
     explicit Holder(int v) : value(v) {} 

     public: 
     bool operator==(const Holder & other) const 
     { 
      return value == other.value; 
     } 

     int get() const 
     { 
      return value; 
     } 

     friend struct Color; 
    }; 

    protected:   
    static Holder makeHolder(int v) 
    { 
     return Holder(v); 
    } 

    public: 
    static const Holder red; 
    static const Holder blue; 
    static const Holder green; 
}; 


struct DressColor : Color 
{ 
    static const Holder pink; 
    static const Holder yellow; 
}; 

    // these in a .cpp file. 
const Color::Holder Color::red(1); 
const Color::Holder Color::blue(10); 
const Color::Holder Color::green(12); 
const Color::Holder DressColor::pink(Color::makeHolder(2)); 
const Color::Holder DressColor::yellow(Color::makeHolder(3)); 

    // how you can create a variable of one. Note that whilst you cannot construct 
    // a Color::Holder from an int in the regular way, you can copy-construct. 

    Color::Holder var(Color::red); 

當然在這個「解決方法」中,枚舉對象仍然Color::Holder類型的,並且用於使用class DressColor不能DressColor::Holder類型。

+0

很酷,但問題在於枚舉本身是無名的,所以你必須使用int來表示任何顏色的變量。 – rodrigo

+0

我剛剛發佈了一個解決方案,可以讓您解決這個問題。 – CashCow

+0

最後,我需要編寫一個函數來修改每個類的顏色。我可以使用匿名枚舉方法嗎? – Yakov

0

你的代碼甚至沒有正確的C++關鍵字。

您的… Color類不代表顏色,所以類名稱有些誤導。

但無論如何…


擴展一個enum是不平凡的,因爲它需要超類,子類不,這就是爲什麼它不被支持的語言。

但似乎你只對名稱有興趣,沒有任何強大的打字,在這種情況下,你可以做…

struct SkirtColors 
{ 
    enum { red = 1, blue = 10, green = 12 }; 
}; 

struct DressColors 
    : SkirtColors 
{ 
    enum { pink = 2, yellow = 3 }; 
}; 
+0

確定其他人已經回答了相同的問題,但是沒有提供有關爲什麼類型不明的問題的信息。我被Avira反病毒推遲了,它將[foo.exe](通過Visual C++編譯器運行上述代碼)識別爲惡意軟件。至少可以這麼說。 –

0

我傾向於開始與enum名稱顏色的所有,然後從第一枚舉添加了各種具體的人,並使用值:

struct colors { 
    enum colors { 
     red = 1, 
     blue = 10, 
     pink = 2, 
     green = 12, 
     yellow = 3 
    }; 
}; 

struct skirt_colors { 
    enum colors { 
     red = colors::red, 
     blue = colors::blue, 
     green = colors::green 
    }; 
};