Murilo :P

Computação, programação, web e afins :)

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

com 7 comentários

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.

Escrito por Murilo Adriano

Sexta-Feira 29 de Maio de 2009 às 01:28

Publicado em C/C++, Programação

Etiquetado com , , ,

7 Respostas

Subscreva aos comentários comRSS.

  1. “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

  2. Hehehe, é isso aí!
    Perseverança!

    Murilo Adriano

    Segunda-feira 15 de Junho de 2009 em 23:25

  3. Ótimo artigo, muito obrigado.

    Anonimo

    Sábado 25 de Julho de 2009 em 18:41

  4. [...] com um comentário Mais uma trick com enums. [...]

  5. 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

  6. Muito bom artigo, obrigado por compartilhar, me ajudou muito!

    Yuri Souza Padua

    Quinta-feira 15 de Outubro de 2009 em 02:41


Deixe uma resposta