No seguinte trecho de código, a Color
enumeração é declarada na Car
classe para limitar o escopo da enumeração e tentar não "poluir" o espaço para nome global.
class Car
{
public:
enum Color
{
RED,
BLUE,
WHITE
};
void SetColor( Car::Color color )
{
_color = color;
}
Car::Color GetColor() const
{
return _color;
}
private:
Car::Color _color;
};
(1) Essa é uma boa maneira de limitar o escopo da Color
enumeração? Ou devo declará-lo fora da Car
classe, mas possivelmente dentro de seu próprio espaço para nome ou estrutura? Acabei de encontrar este artigo hoje, que defende o último e discute alguns pontos interessantes sobre enumerações: http://gamesfromwithin.com/stupid-c-tricks-2-better-enums .
(2) Neste exemplo, ao trabalhar na classe, é melhor codificar a enumeração como Car::Color
, ou seria Color
suficiente? (Presumo que o primeiro seja melhor, apenas no caso de outro Color
enum declarado no espaço de nomes global. Dessa forma, pelo menos, somos explícitos sobre o enum a que estamos nos referindo.)
Car::Color getColor()
masvoid Car::setColor(Color c)
porquesetColor
já temos o especificador.Atualmente - usando C ++ 11 - você pode usar a classe enum para isso:
AFAII isso faz exatamente o que você deseja.
fonte
Eu prefiro seguir a abordagem (código abaixo). Ele resolve o problema da "poluição do espaço para nome", mas também é muito mais seguro (você não pode atribuir e nem comparar duas enumerações diferentes, ou a sua enumeração com outros tipos internos, etc.).
Uso:
Crio macro para facilitar o uso:
Uso:
Algumas referências:
fonte
if(c2 == Color::Red )
é razoável e preciso compilar, mas no seu exemplo ele . não mesmo argumento para atribuição também!c2
é de outro tipo (Color2
), então por que você acha que asc2 == Color::Red
tarefas devem ser compiladas? E seColor::Red
for 1 eColor2::Red
for 2? DeveColor::Red == Color2::Red
avaliar paratrue
oufalse
? Se você misturar enumeradores que não sejam tipicamente seguros, terá um mau momento.Em geral, eu sempre coloco minhas enumerações em a
struct
. Eu já vi várias diretrizes, incluindo "prefixo".Sempre pensei que isso parecia mais
C
diretrizes do que diretrizesC++
(por uma por causa da abreviação e também por causa dos espaços para nome emC++
).Portanto, para limitar o escopo, agora temos duas alternativas:
Pessoalmente, costumo usar a
struct
porque ele pode ser usado como parâmetros para a programação de modelos, enquanto um espaço para nome não pode ser manipulado.Exemplos de manipulação incluem:
que retorna o número de elementos de enum dentro da estrutura
T
:)fonte
Se você estiver criando uma biblioteca de códigos, eu usaria um espaço para nome. No entanto, você ainda pode ter apenas uma enumeração de cores dentro desse espaço para nome. Se você precisar de uma enumeração que possa usar um nome comum, mas que possa ter constantes diferentes para classes diferentes, use sua abordagem.
fonte