La Base de l'héritage de classe enum
Est-il un modèle où je peux hériter enum à partir d'un autre enum en C++??
Quelque chose comme ça:
enum eBase
{
one=1, two, three
};
enum eDerived: public eBase
{
four=4, five, six
};
Vous devez vous connecter pour publier un commentaire.
Pas possible. Il n'y a pas d'héritage avec les énumérations.
Place, vous pouvez utiliser les classes nommés const ints.
Exemple:
Colors
des instances de classe. Vous utilisez uniquement les valeurs int dans la static const membres.Color
, comme vous pourriez pour uneenum
.static const int RED
il devient unstatic const Colors RED
l'initialisation de la variable e de mettre l'int de la valeur à un champ privé, il pourrait le faireint basic(EnumBase b) { return b; }
etint derived(EnumDeriv d) { return d; }
, ces types ne seront pas convertiblesint
, bien que la plaine les énumérations sont. Et quand vous essayez, même le simple d'un code comme celui-ci:cout << basic(EnumBase::One) << endl;
, alors vous aurez un message d'erreur:conversion from ‘EnumBase::<anonymous enum>’ to non-scalar type ‘EnumBase’ requested
. Ces problèmes peuvent probablement être corrigé par l'ajout de certains opérateurs de conversion.Vous ne pouvez pas le faire directement, mais vous pouvez essayer d'utiliser la solution de cette article.
L'idée principale est d'utiliser l'assistant de modèle de classe qui détient les valeurs de l'enum et a le type d'opérateur de cast. Considérant que le type sous-jacent pour l'enum est
int
vous pouvez utiliser cette titulaire de la classe de façon transparente dans votre code au lieu de l'enum.Malheureusement, il n'est pas possible en C++14. J'espère que nous aurons un tel langage en C++17. Comme vous l'avez déjà obtenu quelques solutions pour votre problème, je ne fournira pas une solution.
Je tiens à souligner que le libellé devrait être "extension" n'est pas "l'héritage". L'extension permet plus de valeurs (comme vous allez sauter de 3 à 6 valeurs dans votre exemple), tandis que l'héritage signifie mettre plus de contraintes à une classe de base afin de l'ensemble des possibilités de travailler. Par conséquent, le potentiel de l'incantation de travail exactement à l'opposé de l'héritage. Vous pouvez lancer classe dérivée de la classe de base et non pas vice-verset avec l'héritage de classe. Mais quand avoir des extensions que vous "devrait" être en mesure de lancer la classe de base pour son extension et non pas vice-verset. Je dis "devrait" car, comme je l'ai dit une telle fonctionnalité n'existe pas.
extends
est un mot-clé pour l'héritage dans le langage Eiffel.Comment à ce sujet? Ok une instance est créée pour chaque valeur possible, mais, outre qu'il est très flexible. Existe-il des inconvénients?
.h:
.rpc:
Utilisation:
BaseEnum::i
public etBaseEnum::maxI
privé.Bien, si vous allez définir
enum
avec le même nom dans la classe dérivée et le démarrer à partir du dernier élément de correspondantenum
dans la classe de base, vous recevrez presque ce que vous voulez, héritée de l'enum.Regardez ce code:
Comme l'a déclaré
bayda
, l'enum ne le fait pas (et/ou ne devrait pas) ont des fonctionnalités, j'ai donc pris l'approche suivante à votre dilemme en s'adaptantMykola Golubyev
's réponse:Vous pouvez utiliser un projet SuperEnum pour créer extensible énumérations.
const int&
pour un simpleint
Impossible.
Mais vous pouvez définir l'énumération de façon anonyme dans une classe, puis d'en ajouter d'autres enum constantes dans les classes dérivées.
Genre de hacky mais c'est ce que j'ai trouvé si vous traitez avec l'étendue des enums:
et ensuite utiliser comme:
Utilisation: