Archive for May 2009
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 enum
s:
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 enum
s 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 enum
s 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 enum
s diferentes que representam coisas diferentes mas que podem ter a mesma constante. Como?
A resposta é namespace
s!
Em C++ podemos declarar nossos enum
s dentro de namespace
s 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; [/code] É isso aí galera, até a próxima.
Como implementar facilmente getters e setters em C++
Se você é como eu que odeia ficar digitando dois métodos para cada atributo que você cria em sua classe, seus problemas acabaram.
Trata-se de uma macro feita através de um #define mesmo que facilita muito a vida dos programadores OO em C++.
Vejamos a macro:
#define declare(type, name) \ private: type _##name; \ public: \ void set##name(const type& var) \ {\ _##name = var;\ }\ \ type get##name() \ {\ return _##name; \ }\