[C++] Declarar una enumeración dentro de una clase


Answers

Hoy en día, usando C ++ 11, puedes usar la clase enum para esto:

enum class Color { RED, BLUE, WHITE };

AFAII esto hace exactamente lo que quieres.

Question

En el siguiente fragmento de código, la Enum de Color se declara dentro de la clase Car para limitar el alcance de la enumeración e intentar 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 manera de limitar el alcance de la enumeración de Color ? O, ¿debería declararlo fuera de la clase Car , pero posiblemente dentro de su propio espacio de nombres o estructura? Acabo de encontrar este artículo hoy, que defiende lo último y analiza algunos aspectos 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 bastará con Color ? (Supongo que el primero es mejor, en caso de que haya otra Enum de Color declarada en el espacio de nombres global. De esa forma, al menos, somos explícitos sobre la enumeración a la que nos referimos).




En general, siempre pongo mis enums en una struct . He visto varias pautas que incluyen "prefixing".

enum Color
{
  Clr_Red,
  Clr_Yellow,
  Clr_Blue,
};

Siempre pensé que esto se parecía más a las pautas de C++ que a las de C++ (por ejemplo, debido a la abreviación y también a los espacios de nombres en C++ ).

Entonces, para limitar el alcance, ahora tenemos dos alternativas:

  • espacios de nombres
  • estructuras / clases

Personalmente tiendo a usar una struct porque puede usarse como parámetros para la programación de plantillas, mientras que un espacio de nombres no puede ser manipulado.

Los ejemplos de manipulación incluyen:

template <class T>
size_t number() { /**/ }

que devuelve la cantidad de elementos de enum dentro de la estructura T :)




Links