En el siguiente fragmento de código, la Colorenumeración se declara dentro de la Carclase 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 Colorenumeración? ¿O debería declararlo fuera de la Carclase, 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 Colorsuficiente? (Supongo que lo primero es mejor, en caso de que haya otra Colorenumeració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)porquesetColorya 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!c2es de otro tipo (Color2), entonces, ¿por qué crees que lasc2 == Color::Redtareas deberían compilarse? ¿Qué pasa siColor::Redes 1 yColor2::Redes 2? DebeColor::Red == Color2::Redevaluar atrueofalse? 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
Cpautas 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
structporque 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