En el siguiente fragmento de código, la Color
enumeración se declara dentro de la Car
clase para limitar el alcance de la enumeración y tratar de no "contaminar" el espacio de nombres global.
class Car
{
public:
enum Color
{
RED,
BLUE,
WHITE
};
void SetColor( Car::Color color )
{
_color = color;
}
Car::Color GetColor() const
{
return _color;
}
private:
Car::Color _color;
};
(1) ¿Es esta una buena forma de limitar el alcance de la Color
enumeración? ¿O debería declararlo fuera de la Car
clase, pero posiblemente dentro de su propio espacio de nombres o estructura? Acabo de encontrar este artículo hoy, que defiende este último y discute algunos puntos interesantes sobre las enumeraciones: http://gamesfromwithin.com/stupid-c-tricks-2-better-enums .
(2) En este ejemplo, cuando se trabaja dentro de la clase, ¿es mejor codificar la enumeración como Car::Color
, o sería Color
suficiente? (Supongo que lo primero es mejor, en caso de que haya otra Color
enumeración declarada en el espacio de nombres global. De esa manera, al menos, somos explícitos sobre la enumeración a la que nos referimos).
Car::Color getColor()
perovoid Car::setColor(Color c)
porquesetColor
ya tenemos el especificador.Hoy en día, usando C ++ 11, puede usar la clase enum para esto:
AFAII esto hace exactamente lo que quieres.
fuente
Prefiero seguir el enfoque (código a continuación). Resuelve el problema de la "contaminación del espacio de nombres", pero también es mucho más seguro (no puede asignar e incluso comparar dos enumeraciones diferentes, o su enumeración con cualquier otro tipo incorporado, etc.).
Uso:
Creo macro para facilitar el uso:
Uso:
Algunas referencias:
fuente
if(c2 == Color::Red )
es razonable y debe compilar, pero en su ejemplo . no hace el mismo argumento a favor de asignación también!c2
es de otro tipo (Color2
), entonces, ¿por qué crees que lasc2 == Color::Red
tareas deberían compilarse? ¿Qué pasa siColor::Red
es 1 yColor2::Red
es 2? DebeColor::Red == Color2::Red
evaluar atrue
ofalse
? Si mezclas enumeradores que no sean seguros para escribir, lo pasarás mal.En general, siempre pongo mis enumeraciones en a
struct
. He visto varias pautas que incluyen "prefijos".Siempre pensé que esto se parecía más a
C
pautas que aC++
unas (por una abreviatura y también por los espacios de nombresC++
).Entonces, para limitar el alcance, ahora tenemos dos alternativas:
Personalmente, tiendo a usar un
struct
porque se puede usar como parámetros para la programación de plantillas, mientras que un espacio de nombres no se puede manipular.Los ejemplos de manipulación incluyen:
que devuelve el número de elementos de enum dentro de la estructura
T
:)fuente
Si está creando una biblioteca de códigos, usaría el espacio de nombres. Sin embargo, solo puede tener una enumeración de color dentro de ese espacio de nombres. Si necesita una enumeración que podría usar un nombre común, pero podría tener diferentes constantes para diferentes clases, use su enfoque.
fuente