Un tipo de datos enumerado es una manera de asociar nombres a
números, y por consiguiente de ofrecer más significado a alguien
que lea el código. La palabra reservada enum
(de C)
enumera automáticamente cualquier lista de identificadores que
se le pase, asignándoles valores de 0, 1, 2, etc. Se pueden
declarar variables enum
(que se representan siempre
como valores enteros). La declaración de un enum
se
parece a la declaración de un struct
.
Un tipo de datos enumerado es útil cuando se quiere poder seguir la pista de alguna característica:
//: C03:Enum.cpp // Keeping track of shapes enum ShapeType { circle, square, rectangle }; // Must end with a semicolon like a struct int main() { ShapeType shape = circle; // Activities here.... // Now do something based on what the shape is: switch(shape) { case circle: /* circle stuff */ break; case square: /* square stuff */ break; case rectangle: /* rectangle stuff */ break; } } ///:~
Listado 3.48. C03/Enum.cpp
shape
es una variable del tipo de datos
enumerado ShapeType
, y su valor se compara con el
valor en la enumeración. Ya que shape
es
realmente un int
, puede albergar cualquier valor
que corresponda a int
(incluyendo un número
negativo). También se puede comparar una variable
int
con un valor de una enumeración.
Se ha de tener en cuenta que el ejemplo anterior de intercambiar los tipos tiende a ser una manera problemática de programar. C++ tiene un modo mucho mejor de codificar este tipo de cosas, cuya explicación se pospondrá para mucho mas adelante en este libro.
Si el modo en que el compilador asigna los valores no es de su agrado, puede hacerlo manualmente, como sigue:
enum ShapeType { circle = 10, square = 20, rectangle = 50 };
Si da valores a algunos nombres y a otros no, el compilador utilizará el siguiente valor entero. Por ejemplo,
enum snap { crackle = 25, pop };
El compilador le da a pop
el valor
26
.
Es fácil comprobar que el código es más legible cuando se
utilizan tipos de datos enumerados. No obstante, en cierto
grado esto sigue siendo un intento (en C) de lograr las cosas
que se pueden lograr con una class
en C++, y por eso
verá que enum
se utiliza menos en C++.
Las enumeraciones en C son bastante primitivas, simplemente asocian valores enteros a nombres, pero no aportan comprobación de tipos. En C++, como era de esperar a estas alturas, el concepto de tipos es fundamental, y eso se cumple con las enumeraciones. Cuando crea una enumeración nombrada, crea efectivamente un nuevo tipo, tal como se hace con una clase: El nombre de la enumeración se convierte en una palabra reservada durante esa unidad de traducción.
Además, hay una comprobación de tipos mas estricta para la
enumeración en C++ que en C. En particular, resulta evidente
si tiene una instancia de la enumeración color
llamada a
. En C puede decir
a++
, pero en C++ no es posible. Eso se debe a que
el incrementar una enumeración se realizan dos conversiones de
tipo, una de ellas es legal en C++ y la otra no. Primero, el
valor de la enumeración se convierte del tipo
color
a int
, luego el valor se
incrementa, y finalmente el int
se vuelve a
convertir a tipo color
. En C++ esto no está
permitido, porque color
es un tipo diferente de
int
. Eso tiene sentido, porque ¿cómo saber si el
incremento de blue
siquiera estará en la
lista de colores? Si quiere poder incrementar un
color
, debería ser una clase (con una operación
de incremento) y no un enum,
porque en la clase se
puede hacer de modo que sea mucho más seguro. Siempre que
escriba código que asuma una conversión implícita a un tipo
enum
, el compilador alertará de que se trata de una
actividad inherentemente peligrosa.
Las uniones (descriptas a continuación) tienen una comprobación adicional de tipo similar en C++.