Tipo de enumeración en C++

Jinku Hu 12 octubre 2023
  1. Enumeraciones sin ámbito en C++
  2. Enumeraciones con ámbito en C++
Tipo de enumeración en C++

Este artículo demostrará cómo utilizar el tipo de enumeración en C++.

Enumeraciones sin ámbito en C++

Las enumeraciones han sido parte del lenguaje C durante un tiempo. El C++ también implementó el mismo concepto con algunas características adicionales. Generalmente, la enumeración es el mecanismo para nombrar enteros constantes. El programador define los nombres de los enumeradores. Los valores integrales pueden especificarse explícitamente o inferirse por la posición del nombre dado.

Las enumeraciones se determinan mediante la palabra clave enum y pueden definir opcionalmente un nombre para el tipo (por ejemplo, Color en el siguiente fragmento de código). Tenga en cuenta que las constantes de enumeración de C++ tienen tipos integrales definidos por la implementación. Entonces, si los valores dados necesitan un espacio mayor que el int, el tipo integral correspondiente se elige como el tipo subyacente. El usuario también puede especificar explícitamente el tipo después del nombre de la enumeración y debe separarse con dos puntos (se muestra en el cuarto fragmento de código de este artículo).

En el siguiente ejemplo, definimos una enumeración llamada Color y especificamos los nombres de los seis colores como las constantes enumeradas. Dado que ninguna de estas constantes tiene asignado el valor explícito, los valores integrales se deducen con sus posiciones comenzando desde cero. Este código implementa una función de conversión de color a cadena, que está limitada a los valores dados. La variable Color también es una enumeración sin ámbito; esto significa que sus enumeradores (constantes) son accesibles desde el mismo ámbito que la enumeración misma.

#include <iostream>

using std::cout;
using std::endl;
using std::string;

enum Color { RED, GREEN, BLUE, CYAN, MAGENTA, YELLOW };

string ColorToString(Color c) {
  switch (c) {
    case RED:
      return "Red";
    case BLUE:
      return "Blue";
    case GREEN:
      return "Green";
    case CYAN:
      return "Cyan";
    case MAGENTA:
      return "Magenta";
    case YELLOW:
      return "Yellow";
    default:
      return "NAN";
  }
}

int main() {
  Color col1 = RED;

  cout << "the given color is " << ColorToString(col1) << endl;

  return EXIT_SUCCESS;
}

Producción :

the given color is Red

Alternativamente, podemos definir una enumeración (por ejemplo, WeekDay) donde cada enumerador tiene el valor integral asignado explícitamente. Puede utilizar esta función para implementar una estructura flexible que se puede modificar de acuerdo con diferentes convenciones de fechas. Los valores explícitos y posicionales se pueden mezclar en el mismo objeto de enumeración si es necesario.

#include <iostream>

using std::cout;
using std::endl;

enum WeekDay { MON = 1, TUE = 2, WED = 3, THU = 4, FRI = 5, SAT = 6, SUN = 7 };

int main() {
  auto today = SAT;
  cout << "today is " << today << "th day" << endl;

  return EXIT_SUCCESS;
}

Producción :

today is 6th day

Enumeraciones con ámbito en C++

Otra característica útil de las enumeraciones es tener un alcance; por lo tanto, se llama enumeraciones con ámbito. Este último se puede declarar utilizando las palabras clave enum class o enum struct. Las enumeraciones con ámbito siguen las convenciones habituales del ámbito y no son accesibles fuera del ámbito de la enumeración. En el lado positivo, las enumeraciones de ámbito global no darán lugar a colisiones de nombres como podrían suceder las enumeraciones sin ámbito.

El siguiente ejemplo de código define WeekDay del ejemplo anterior como la enumeración con ámbito. Tenga en cuenta que las enumeraciones sin ámbito se pueden imprimir utilizando la función cout como cualquier otra variable, pero la enumeración con ámbito debe convertirse en el valor integral correspondiente.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

Producción :

today is 6th day

Las enumeraciones con ámbito deben tener un nombre, a diferencia de las enumeraciones sin ámbito. Por otro lado, la enumeración con ámbito no tiene un tipo integral subyacente predeterminado. Tenga en cuenta que la conversión de tipo subyacente puede producir desbordamientos cuando los enumeradores se convierten en tipos diferentes.

#include <iostream>

using std::cout;
using std::endl;

enum class WeekDay : int {
  MON = -1,
  TUE = 2,
  WED = 3,
  THU = 4,
  FRI = 5,
  SAT = 6,
  SUN = 7
};

int main() {
  auto today = WeekDay::MON;
  cout << "today is " << static_cast<unsigned>(today) << "th day" << endl;

  return EXIT_SUCCESS;
}

Producción :

today is 4294967295th day
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Artículo relacionado - C++ Enum