Las clases de enumeración ("enumeraciones nuevas", "enumeraciones fuertes") abordan tres problemas con las enumeraciones tradicionales de C ++:
- convencional
enums
implícitamente se convierte en int
, provocando errores cuando alguien no quiere que una enumeración actúe como un número entero.
enums
exportan sus enumeradores convencionales al ámbito circundante, lo que provoca conflictos de nombres.
- El tipo subyacente de an
enum
no se puede especificar, lo que genera confusión, problemas de compatibilidad y hace imposible la declaración hacia adelante.
enum class
("enumeraciones fuertes") están fuertemente tipados y con alcance:
enum Alert { green, yellow, orange, red };
enum class Color { red, blue };
enum class TrafficLight { red, yellow, green };
Alert a = 7;
Color c = 7;
int a2 = red;
int a3 = Alert::red;
int a4 = blue;
int a5 = Color::blue;
Color a6 = Color::blue;
Como se muestra, las enumeraciones tradicionales funcionan como de costumbre, pero ahora puede calificar opcionalmente con el nombre de la enumeración.
Las nuevas enumeraciones son "clase de enumeración" porque combinan aspectos de enumeraciones tradicionales (valores de nombres) con aspectos de clases (miembros de ámbito y ausencia de conversiones).
Ser capaz de especificar el tipo subyacente permite una interoperabilidad más simple y tamaños garantizados de enumeraciones:
enum class Color : char { red, blue };
enum class TrafficLight { red, yellow, green };
enum E { E1 = 1, E2 = 2, Ebig = 0xFFFFFFF0U };
enum EE : unsigned long { EE1 = 1, EE2 = 2, EEbig = 0xFFFFFFF0U };
También permite la declaración hacia adelante de enumeraciones:
enum class Color_code : char;
void foobar(Color_code* p);
enum class Color_code : char { red, yellow, green, blue };
El tipo subyacente debe ser uno de los tipos enteros con o sin signo; el predeterminado es int
.
En la biblioteca estándar, las enum
clases se utilizan para:
- Sistemas de cartografía códigos de error específicos: En
<system_error>
: enum class errc
;
- Indicadores de seguridad de puntero: En
<memory>
:enum class pointer_safety { relaxed, preferred, strict };
- Errores de flujo de E / S: En
<iosfwd>
:enum class io_errc { stream = 1 };
- Manejo de errores de comunicaciones asincrónicas: En
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Varios de estos tienen operadores, como los ==
definidos.
enum class Colours
yenum class Fruits
. Porque cuando escribí el código en VS 2010. arroja un error"expects a defination or a tag name"
debajoclass
.