Hola compañeros ! Me entró una duda sobre la definición de ciertas variables.
Supongamos tengo la siguiente enumeración:
namespace ENUM
{
enum ID
{
a,
b,
c,
};
}
Cuál sería una forma correcta de declarar un valor de dicha enumeración?
ENUM::ID valor = ENUM::a;
o
unsigned int valor = ENUM::a;
He visto ejemplo donde se utiliza la primera, pero según lo que he alcanzado a estudiar, la segunda sería más ideal.
Cómo sé cual de las dos debo utilizar dependiendo de cierto contexto?
Saludos y gracias de antemano.
Salvo que se indique otra cosa, los enumerados son por defecto ints.
En realidad el compilador va a convertir tus enums en ints... pero con algunas restricciones relativas al uso de operadores:
// esta linea provoca un warning
ENUM::ID valor = ENUM::a | ENUM::b;
// mientras que esta otra linea no
int valor = ENUM::a | ENUM::b;
La ventaja de usar ENUM::ID en vez de int es que el que vaya a usar tus funciones / clases sabrá en todo momento cual es el rango válido de valores... ya que vienen definidos por el enumerado.
A partir de la versión 11 de C++ se puede especificar un tipo concreto para el enum:
enum ENUM : unsigned long { a, b, c, maximo = 0xFFFFFFFFU }
Ahora, si son "constantes" su valor no se puede cambiar una vez declarado. Entonces ¿cómo lo vas a cambiar? Cualquier instrucción de asignación de un valor luego de la declaración de la enumeración sería ilegal. Yo creo que no puedes. De hecho, estuve probándolo y el compilador me da un error en cuanto intento asignar un valor a alguna de las constantes fuera de la declaración del enum.
Estás mezclando conceptos.
Que los valores del enumerado sean constantes quiere decir que no puedes redefinir sus valores, es decir, la siguiente línea da un error de compilación:
ENUM::a = 78
Sin embargo, nada te impide almacenar el valor en una variable y manipularlo a tu antojo. La relación que se va a mantener constante durante toda la ejecución del programa es que ENUM::a
siempre va a tener el mismo valor.
Si quieres poder cambiar los valores a los campos debes usar otro tipo de dato, como un struct por ejemplo.
Sigues mezclando conceptos. Las estructuras es un tipo que permite crear estructuras ( valga la redundancia ) complejas de datos, por ejemplo te permite agrupar el puntero a un vector y la variable que indica el número de elementos en dicho vector para que siempre vayan juntos:
struct Vector
{
int* puntero;
int size;
};
Realmente, como he comentado antes, solo necesitas almacenar el valor del enumerado en una variable de tipo numérico ( si no es del mismo tipo que el predefinido para el enum puede que tengas que hacer un casting ) y después puedes manipular la variable a tu antojo... eso si, no hay impedimentos para que esa variable forme parte de una estructura, una clase o una unión.