cpp-enumeraciones

Qué son y cómo usar las enumeraciones en C++

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.

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 y Domingo.
  • 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 valores Rojo, Verde y Azul
  • 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;
}