2011-04-16 171 views
6

說我創建一個枚舉,但最終有人想要添加到該枚舉,這是什麼樣呢? 例如:擴展枚舉?

blah.hpp 
enum PizzaDressing { 
DRESSING_OLIVES = 0, 
DRESSING_CHEESE = 1 
}; 

,並在我的FunkyPizza類,有可能是辣椒澆頭。

所以我怎麼可能加辣椒顯然沒有修改原始枚舉?

謝謝

+0

可能重複繼承](http://stackoverflow.com/questions/644629/base-enum-class-inheritance) – DuckMaestro 2013-03-20 22:28:24

回答

3

由於枚舉通常在編譯器INT的一些大小進行處理,所有你需要做的就是後來讓

enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1, 
    Pepperoni = 2 
}; 

,或者你可以讓它計算

enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1, 
    Pepperoni 
}; 

你可以,如果沒有那些由於某種原因接受,使用數學(Cheese + 1)。 你可以用幾乎任何你可以用數字值的方式玩enum。

請注意,您使用枚舉通常烤到編譯器的代碼,它不顯示它的名字,簡單的價值。因此,稍後修改(擴展)枚舉器不會影響已構建的代碼。

我認爲這是合法的語法在另一個枚舉使用枚舉,用石膏,但我從來沒有嘗試過。這可能工作,但有點難看:

enum PizzaDressing 
{ 
    Olives = 0, 
    Cheese = 1 
}; 

enum OtherPizzaDressings 
{ 
    Start = (OtherPizzaDressings)PizzaDressing::Cheese; 
    Pepperoni 
}; 
2

這將被稱爲「動態枚舉」。據我所知,C++中沒有這樣的東西。然而,由於我們使用C++而不是C,你可以做這樣的事情:

#include <string> 
#include <map> 

std::map<std::string, int> myMap; 
myMap["DRESSING_OLIVES"] = 0; 
myMap["DRESSING_CHEESE"] = 1; 
myMap["PEPPER_TOPPING"] = 2; 
+4

必須指出的是,使用的映射的開銷比使用純'enum'大得多。 'map'是一個在執行過程中動態構建和維護的數據結構:'map'元素的每個訪問都是一個函數調用。 'enum'是一種新的編譯時類型,與'int'一樣複雜。 – lvella 2011-04-16 02:16:28

+0

+1:良好的通話.. – 2011-04-16 02:20:19

+0

呀,這張地圖的字符串會比正常的枚舉是非常緩慢的。而且在C#中沒有「動態枚舉」(我應該知道;我爲此問題編寫了解決方法:http://www.codeproject.com/KB/cs/symbol.aspx) – Qwertie 2011-04-16 06:06:19

0

您不能動態修改枚舉,因爲它只能定義在編譯時解析的新類型。它們是程序員的助記符,編譯時它們被轉換爲數字。

這就是說,你可以使用不使用原來的枚舉的任何數字來表示任何你想要的:

PizzaDressing a; 
a = (PizzaDressing)5; 
+0

但是,你可以簡單地在任何地方使用數字。那麼有什麼意義呢?最好使用編譯器/語言功能來跟蹤它,而不是通過討厭的手來做它。 – SasQ 2012-08-12 04:11:27

+0

我不知道。我不知道你在做什麼。我只是解釋編譯器功能,所以可以決定如何繼續使用它。也許有一個'map ',其中一些名稱的值被動態定義爲100以上,100以下有一個靜態定義的'enum'。無論如何,這只是一種程序員可以根據自己的喜好編寫和使用該語言的無限可能性。 – lvella 2012-08-13 15:50:48

4

這是最接近你想要什麼:Base enum class inheritance

[基本枚舉類
+0

對不起,線程死靈,但我必須強調,這是一個比接受的答案描述更好的方法。它允許擴展枚舉的方式使得不可能將擴展值傳遞給無法處理它們的舊函數。 – antipattern 2016-07-22 14:44:35

+0

@antipattern:在SO上沒有線程死靈,因爲沒有線程,只有問題,答案和評論;)。 – rubenvb 2016-07-22 14:47:05