les espaces de noms pour les types enum - les meilleures pratiques

Souvent, on a besoin de plusieurs types énumérés ensemble. Parfois, on a un conflit de nom. Deux solutions à cela viennent à l'esprit: utiliser un espace de noms, ou de l'utilisation de 'plus grand' enum les noms d'éléments. Encore, l'espace de solution a deux implémentations possibles: un mannequin de classe avec imbriqué enum, ou une pleine soufflé espace de noms.

Je suis à la recherche pour les avantages et inconvénients des 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: //...
        //...
    }
  }
  • Tout d'abord, je voudrais utiliser Couleur::Rouge, Sentiment:la Colère, etc
  • bonne question, j'ai utilisé la méthode d'espace de noms.... 😉
  • le "c" préfixe sur tout ce qui blesse la lisibilité.
  • pourquoi, je vous remercie pour l'ouverture du hongrois discussion 🙂
  • Notez que vous n'avez pas besoin de nom de l'énumération que dans enum e {...}, les énumérations peuvent être anonymes, c'est à dire enum {...}, qui fait beaucoup plus de sens quand enveloppé dans l'espace de noms ou de classe.
  • si vous avez un non-nommées enum, quel est son type? par exemple: enum TOTO{}; void bar(FOO e); mais si nous avons enum{} void bar2(???);
  • Vous avez raison, mais seulement pour les classes. Pour les espaces de noms, il est préférable de retenir les énumérations non-anonyme, parce que vous ne pouvez pas utiliser l'espace de noms du nom lui-même comme un type nom; vous pouvez utiliser uniquement le nom de l'intérieure enum pour que.

InformationsquelleAutor xtofl | 2009-01-27