80 votes

Étendre des énumérations en C ++?

Y at-il un moyen en C ++ d'étendre / "hériter" des énumérations?

C'EST À DIRE:

 enum Enum {A,B,C};
enum EnumEx : public Enum {D,E,F};
 

ou au moins définir une conversion entre eux?

68voto

Matthieu M. Points 101624

Non, il n'est pas.

enum sont vraiment pauvre chose en C++, et c'est malheureux de cours.

Même l' class enum introduit dans C++0x ne traite pas de ce problème de l'extensibilité (même si ils font des choses pour le type de sécurité au moins).

Le seul avantage de l' enum , c'est qu'ils n'existent pas: ils offrent un certain type de sécurité, tout en n'imposant pas de gestion d'exécution comme ils sont remplacés par le compilateur directement.

Si vous voulez une telle bête, vous aurez à travailler vous-même:

  • créer une classe MyEnum, qui contient un int (en gros)
  • créer nommé constructeurs pour chacune des valeurs intéressantes

vous pouvez maintenant étendre votre classe (ajout nommé constructeurs) à volonté...

C'est une solution de contournement si, je n'ai jamais trouvé un satistifying façon de traiter avec une énumération...

11voto

marco Points 82

J'ai résolu de cette façon:

 typedef enum
{
    #include "NetProtocols.def"
} eNetProtocols, eNP;
 

Bien sûr, si vous ajoutez un nouveau protocole de réseau dans le fichier NetProtocols.def, vous devez recompiler, mais au moins, il est extensible.

6voto

Laurence Gonsalves Points 50783

Si vous avez été en mesure de créer une sous-classe d'une enum qu'il faudrait travailler dans l'autre sens.

L'ensemble des instances d'une sous-classe est un sous-ensemble des instances de la super-classe. Pensez à la norme "Forme" par exemple. La Forme de la classe représente l'ensemble de toutes les Formes. Le Cercle de la classe, de ses sous-classe, représente le sous-ensemble de Formes qui sont des Cercles.

Donc, pour être cohérente, une sous-classe d'une enum devrait contenir un sous-ensemble des éléments de l'enum il hérite.

(Et non, C++ ne prend pas en charge cette fonction.)

1voto

BadPirate Points 11614

http://www.codeproject.com/KB/cpp/InheritEnum.aspx passe en revue une méthode pour créer une énumération étendue.

1voto

the_drow Points 6141

Pas que je sache de.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X