2011-04-16 131 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