Tipo de enumeração em C++
Este artigo demonstrará como usar o tipo de enumeração em C++.
Enumerações sem escopo em C++
As enumerações fazem parte da linguagem C há algum tempo. O C++ também implementou o mesmo conceito com alguns recursos adicionais. Geralmente, a enumeração é o mecanismo para nomear inteiros constantes. O programador define os nomes dos enumeradores. Os valores integrais podem ser especificados explicitamente ou inferidos pela posição do nome fornecido.
As enumerações são determinadas usando a palavra-chave enum
e podem opcionalmente definir um nome para o tipo (por exemplo, Color
no seguinte trecho de código). Observe que as constantes de enumeração C++ têm tipos integrais definidos pela implementação. Portanto, se os valores fornecidos precisam de espaço maior do que int
, o tipo integral correspondente é escolhido como o tipo subjacente. O tipo também pode ser especificado explicitamente pelo usuário após o nome da enumeração e precisa ser separado por dois pontos (mostrado no quarto trecho de código neste artigo).
No exemplo a seguir, definimos uma enumeração chamada Color
e especificamos os seis nomes de cores como constantes enumeradas. Como nenhuma dessas constantes tem o valor explícito atribuído a elas, os valores integrais são deduzidos com suas posições começando de zero. Este código implementa uma função de conversão de cor para string, que é limitada aos valores fornecidos. A variável Color
também é uma enumeração sem escopo; isso significa que seus enumeradores (constantes) são acessíveis a partir do mesmo escopo da própria enumeração.
#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;
}
Resultado:
the given color is Red
Como alternativa, podemos definir uma enumeração (por exemplo, WeekDay
) em que cada enumerador possui o valor integral atribuído explicitamente. Você pode utilizar este recurso para implementar uma estrutura flexível que pode ser modificada de acordo com diferentes convenções de data. Os valores explícitos e posicionais podem ser misturados no mesmo objeto de enumeração, se necessário.
#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;
}
Resultado:
today is 6th day
Enumerações com escopo em C++
Outro recurso útil das enumerações é ter um escopo; portanto, é chamado de enumerações com escopo. O último pode ser declarado usando palavras-chave enum class
ou enum struct
. As enumerações com escopo seguem as convenções usuais de escopo e não são acessíveis fora do escopo de enumeração. No lado positivo, as enumerações com escopo global não resultarão em conflitos de nomes como as enumerações sem escopo podem fazer.
O próximo exemplo de código define WeekDay
do exemplo anterior como a enumeração com escopo. Observe que as enumerações sem escopo podem ser impressas usando a função cout
como qualquer outra variável, mas aquela com escopo precisa ser convertida para o valor integral correspondente.
#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;
}
Resultado:
today is 6th day
As enumerações com escopo devem ter um nome, em contraste com aquelas sem escopo. Por outro lado, a enumeração com escopo não tem um tipo integral subjacente padrão. Esteja ciente de que a conversão de tipo subjacente pode resultar em estouros quando os enumeradores são convertidos em 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;
}
Resultado:
today is 4294967295th day
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