En C++ una enumeración (o enum
) es una forma de definir un conjunto de valores enteros nombrados bajo un mismo tipo.
Cada miembro de una enumeración es una constante que representa un valor entero único (comenzando por 0 por defecto y aumentando en uno para cada miembro subsecuente)-
Las enumeraciones facilitan la lectura y el mantenimiento del código al reemplazar números mágicos con nombres descriptivos.
Si quieres aprender más sobre Enumeraciones
consulta el Curso de Introducción a la Programación leer más
Definición de una Enumeración
Para definir una enumeración en C++, se utiliza la palabra clave enum
, seguida del nombre de la enumeración y los miembros entre llaves.
enum DiasDeLaSemana
{
Lunes,
Martes,
Miércoles,
Jueves,
Viernes,
Sábado,
Domingo
};
En este ejemplo,
DiasDeLaSemana
es una enumeración con siete miembros:Lunes
,Martes
,Miércoles
,Jueves
,Viernes
,Sábado
yDomingo
.- Por defecto,
Lunes
tiene el valor 0,Martes
tiene el valor 1 (y así sucesivamente)
Enumeraciones con valores específicos
Es posible asignar valores específicos a los miembros de una enumeración (en lugar de utilizar los valores predeterminados).
enum DiasSemana
{
Lunes = 1,
Martes = 2,
Miércoles = 3,
Jueves = 4,
Viernes = 5,
Sábado = 6,
Domingo = 7
};
Si los números son correlativos, puedes numerar únicamente el primero de ellos (el resto serán asignados automáticamente en forma secuencial).
enum DiasSemana
{
Lunes = 1,
Martes,
Miércoles,
Jueves,
Viernes,
Sábado,
Domingo
};
Uso de las enumeraciones
Asignación de valores
Una vez definida una enumeración, puedes asignar valores a variables del tipo de la enumeración:
DiasDeLaSemana hoy = Lunes;
Comparación de valores
También puedes comparar estos valores utilizando operadores de igualdad:
if (hoy == Lunes)
{
std::cout << "Hoy es lunes." << std::endl;
}
Conversión de enumeraciones
Las enumeraciones en C++ se basan en tipos de datos enteros. Por lo que es posible convertir entre una enumeración y su tipo subyacente (que por defecto es int
).
Puedes convertir un valor de enumeración a su representación entera de la siguiente manera:
int valorNumerico = static_cast<int>(Miércoles);
std::cout << valorNumerico << std::endl; // Salida: 2
También puedes convertir un entero a una enumeración, siempre y cuando el valor sea válido para la enumeración:
DiasDeLaSemana dia = static_cast<DiasDeLaSemana>(4);
std::cout << dia << std::endl; // Salida: 4 (dependiendo de la implementación, podría necesitar un cast adicional para imprimir el nombre)
Enumeraciones enumeradas
Las enumeraciones enumeradas (enum class
o enum struct
) son una forma más segura de definir enumeraciones en C++, ya que los valores de una enumeración enumerada no se convierten implícitamente a enteros y no entran en el ámbito global.
La sitaxis para crear una enumeración enumerada
enum class NombreEnum : tipo_base {
Valor1,
Valor2,
// Más valores
};
Por ejemplo,
enum class Color : char {
Rojo,
Verde,
Azul
};
Color c = Color::Rojo;
En este ejemplo,
Color
es una enumeración enumerada con los valoresRojo
,Verde
yAzul
- Cada valor está asociado a un tipo
char
.
Ejemplos prácticos
Uso en una aplicación de tareas
Supongamos que estamos desarrollando una aplicación para gestionar tareas y queremos utilizar enumeraciones para representar el estado de una tarea:
enum EstadoTarea
{
Pendiente,
EnProgreso,
Completada,
Cancelada
};
class Tarea
{
public:
std::string Nombre;
EstadoTarea Estado;
void mostrarEstado()
{
std::cout << "La tarea '" << Nombre << "' está en estado: " << Estado << std::endl;
}
};
int main()
{
Tarea tarea;
tarea.Nombre = "Estudiar para el examen";
tarea.Estado = EnProgreso;
tarea.mostrarEstado(); // Salida: La tarea 'Estudiar para el examen' está en estado: 1
return 0;
}
Uso en un juego
En el desarrollo de juegos, las enumeraciones pueden ser útiles para representar diferentes tipos de enemigos o estados del juego:
enum TipoDeEnemigo
{
Goblin,
Orco,
Dragon
};
class Enemigo
{
public:
TipoDeEnemigo Tipo;
void mostrarTipo()
{
std::cout << "Este enemigo es un: " << Tipo << std::endl;
}
};
int main()
{
Enemigo enemigo;
enemigo.Tipo = Dragon;
enemigo.mostrarTipo(); // Salida: Este enemigo es un: 2
return 0;
}