2011-04-16 23 views
6

Digamos que creo una enumeración pero eventualmente alguien quiere agregar a esa enumeración, ¿qué hace uno? ejemplo:¿Extendiendo una enumeración?

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

y en mi clase FunkyPizza, puede haber ingredientes pimienta.

Entonces, ¿cómo podría agregar pimientos sin obviamente modificar la enumeración original?

Gracias

+0

posible duplicado de [clase de enumeración de base herencia] (http://stackoverflow.com/questions/644629/base-enum-class-inheritance) – DuckMaestro

Respuesta

3

Desde enumeraciones normalmente se tratan como algunos tamaño de int en el compilador, todo lo que tiene que hacer es tarde hacen

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

o se puede permitir que cuente

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

se podría, si ninguno de ellos es aceptable por alguna razón, utiliza matemáticas (Cheese + 1). Puede jugar con la enumeración casi de cualquier manera con un valor numérico.

Tenga en cuenta que el enumerador que utiliza normalmente está incluido en el código por el compilador, no aparece como su nombre, simplemente valor. Por lo tanto, modificar (extender) el enumerador más tarde no afectará el código que se ha creado.

Creo que es una sintaxis legal usar una enumeración en otro enumerador, con moldes, pero nunca lo he intentado. Esto puede funcionar, pero es un poco feo:

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

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

que serían conocidas como "enumeración dinámica". Que yo sepa, nada de esto existe en C++. Sin embargo, ya que estamos usando C++ y no en C, se podría hacer algo como esto:

#include <string> 
#include <map> 

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

Debe tenerse en cuenta que la sobrecarga de usar un mapa es mucho mayor que usar un 'enum' simple. 'map' es una estructura de datos construida y mantenida dinámicamente durante la ejecución: cada acceso en un elemento' map' es una llamada a función. 'enum' es un nuevo tipo de tiempo de compilación, que es tan complejo como' int'. – lvella

+0

+1: buena llamada .. –

+0

Sí, este mapa de cadenas será extremadamente lento en comparación con una enumeración normal. Y no hay "enum dinámico" en C# (debería saber, escribí la solución para ese problema: http://www.codeproject.com/KB/cs/symbol.aspx) – Qwertie

0

Usted no puede modificar dinámicamente una enumeración, ya que sólo se define un nuevo tipo resuelta en tiempo de compilación. Son mnemónicos para el programador, en la compilación se traducen a números.

Dicho esto, se puede utilizar cualquier número no utilizado por la enumeración original, para representar lo que quiera:

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

Pero luego puedes simplemente usar números en todas partes. ¿Entonces cuál es el punto?Sería mejor usar las características del compilador/lenguaje para hacer un seguimiento de él, en lugar de hacerlo por mano repugnante. – SasQ

+0

No lo sé. No tengo idea de lo que estás tratando de hacer. Solo estoy explicando la función del compilador para que uno pueda decidir cómo proceder y usarla. Tal vez uno tiene un 'map ' donde algunos nombres tienen valores definidos dinámicamente por encima de 100, y debajo de 100 hay un 'enum' definido estáticamente. De todos modos, esta es solo una situación de un número infinito de posibilidades que un programador puede inventar y usar el lenguaje a su favor. – lvella

4

Esto está más cerca de lo que quiere: Base enum class inheritance

+0

Lo siento thread nigromancia, pero debo enfatizar que este es un método mucho mejor que la respuesta aceptada describe. Permite extender la enumeración de una manera que hace imposible pasar valores extendidos a funciones antiguas que no pueden manejarlas. – antipattern

+0

@antipattern: no hay nigromancia de hilos en SO, porque no hay hilos, solo preguntas, respuestas y comentarios;). – rubenvb