O que são enums e como utilizá-los melhor em C++

O que são os enums (C e C++)
Um enum (enumeração) é um tipo definido pelo usuário (programador) que consiste em constantes do tipo int nomeadas.
Um jeito tradicional de se declarar constantes em C e C++ é o seguinte:
#define BRASIL 0 #define ITALIA 1 #define PORTUGAL 2 #define ALEMANHA 3
E eis a maneira de fazer o mesmo utilizando enums:
enum
{
BRASIL,
ITALIA,
PORTUGAL,
ALEMANHA
};
Pode-se, alternativamente, criar um tipo para seu enum:
enum Paises
{
BRASIL,
ITALIA,
PORTUGAL,
ALEMANHA
};
E declarar uma variável desse tipo com:
Paises pais; //C++ apenas enum Paises pais; //C e C++
Num enum igual a esses acima, a primeira constante recebe o valor 0 e as subsequentes recebem o valor da constante anterior mais 1. Ou seja, BRASIL é 0, ITALIA é 1, PORTUGAL é 2 e ALEMANHA é 3.
Podemos também atribuir valores manualmente às constantes como em:
enum Paises
{
BRASIL = 2,
ITALIA, //ITALIA é igual a 3 (2 + 1)
PORTUGAL = 1,
ALEMANHA //ALEMANHA é igual a 2 (1 + 1)
};
Como podemos perceber no exemplo anterior, a mesma regra se aplica para os enums com valores manuais, o que não tiver um valor explicitamente inserido receberá o valor do anterior somado em 1. Percebemos também que podem haver constantes com o mesmo valor (BRASIL == ALEMANHA == 2).
Conversão
A conversão de uma constante de um enum para um inteiro por exemplo é feita automaticamente. Já o contrário não deve ser permitido pelo compilador.
enum Paises
{
BRASIL,
ARGENTINA,
VENEZUELA
};
...
int inteiro = VENEZUELA + 2; //4
Paises pais = 3; //ERRO
Uma melhor maneira de usar enums em C++
Veja o exemplo:
enum Paises
{
BRASIL,
ITALIA,
ALEMANHA
};
enum Uvas
{
RUBI,
ITALIA,
UMOUTROTIPODEUVA
};
Isso irá ocasionar um erro porque ITALIA já foi definido. A saida do meu compilador (g++ 4.3.2) foi a seguinte:
murilo@blacksheep:~/$ g++ enums.cpp
enums.cpp:14: error: conflicting declaration ‘ITALIA’
enums.cpp:8: error: ‘ITALIA’ has a previous declaration as ‘Paises ITALIA’
Mas e agora?? Eu quero ter dois enums diferentes que representam coisas diferentes mas que podem ter a mesma constante. Como?
A resposta é namespaces!
Em C++ podemos declarar nossos enums dentro de namespaces e assim termos as constantes em espaços de nomes diferentes. Nada de conflito agora hein g++!!!
namespace Paises
{
enum
{
BRASIL,
ITALIA,
ALEMANHA
};
}
namespace Uvas
{
enum
{
RUBI,
ITALIA,
UMOUTROTIPODEUVA
};
}
//*...*//
//Modo de uso:
std::cout << Uvas::ITALIA;
std::cout << Paises::ITALIA;
É isso aí galera, até a próxima.
“Nada de conflito agora, ein g++!” kkkkkkk³
Apesar de você já ter me explicado isso e eu já ter visto em um código que eu ajudei a desenvolver, não entendo bem.
=x
Mas, quem acredita sempre alcança, não é?
Ainda irei entender.
Eduardo
Domingo 31 de Maio de 2009 em 20:50
Hehehe, é isso aí!
Perseverança!
Murilo Adriano
Segunda-feira 15 de Junho de 2009 em 23:25
Ótimo artigo, muito obrigado.
Anonimo
Sábado 25 de Julho de 2009 em 18:41
[...] com um comentário Mais uma trick com enums. [...]
Sobrecarga do operator++ para enums « Murilo :P
Domingo 26 de Julho de 2009 em 00:37
Ainda há uma dúvida.
Se eu tiver uma string em mãos, dentro de uma variavel qualquer, como posso saber se essa string pode ser ou não um dos elementos do meu Enum?
Por exemplo:
string s = “ITALIA”;
Como saber se s pertence ao ENUM?
Lucas
Sábado 19 de Setembro de 2009 em 01:43
Opa Lucas, desculpe-me pela demora. Ando muito ocupado ultimamente.
Enums são tipos enumerados numéricos, então não tem como comparar diretamente.
O que você pode fazer é o seguinte:
Você pode fazer algo como comparar o valor da string e obter o enum correspondente e trabalhar corretamente com esses enums.
Abração Lucas, valeu!
Murilo Adriano
Quarta-feira 23 de Setembro de 2009 em 09:24
Muito bom artigo, obrigado por compartilhar, me ajudou muito!
Yuri Souza Padua
Quinta-feira 15 de Outubro de 2009 em 02:41