Souvent, on a besoin de plusieurs types énumérés ensemble. Parfois, il y a un conflit de noms. Deux solutions à ce problème viennent à l'esprit : utiliser un espace de noms, ou utiliser des noms d'éléments d'énumération "plus grands". Cependant, la solution de l'espace de noms a deux implémentations possibles : une classe fictive avec des énumérations imbriquées ou un espace de noms à part entière.
Je cherche les avantages et les inconvénients de ces trois approches.
Exemple :
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
19 votes
Tout d'abord, j'utiliserais Color::Red, Feeling:Angry, etc.
0 votes
Bonne question, j'ai utilisé la méthode de l'espace de nom.... ;)
19 votes
Le préfixe "c" sur tout nuit à la lisibilité.
8 votes
@User : pourquoi, merci d'ouvrir la discussion hongroise :)
5 votes
Notez que vous n'avez pas besoin de nommer l'enum comme dans
enum e {...}
les enums peuvent être anonymes, c'est-à-direenum {...}
qui a beaucoup plus de sens lorsqu'il est enveloppé dans un espace de nom ou une classe.0 votes
Si vous avez un enum sans nom, quel est son type ? par exemple : enum FOO{} ; void bar(FOO e) ; mais si nous avons enum{} void bar2( ???);
0 votes
@kralyk : Vous avez raison, mais seulement pour les classes. Pour les espaces de noms, il est préférable de conserver les enums non anonymes, car vous ne pouvez pas utiliser le nom de l'espace de noms lui-même comme nom de type ; vous ne pouvez utiliser que le nom de cet enum interne pour cela.