it-swarm.com.de

Enumerationen in C++ erweitern?

Gibt es in C++ eine Möglichkeit, Enumerationen zu erweitern/"erben"?

I.E:

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

oder zumindest eine Umwandlung zwischen ihnen definieren?

65
cvb

Nein, da ist kein.

enum ist in C++ wirklich das Ärmste, und das ist natürlich bedauerlich.

Sogar der class enum, der in C++ 0x eingeführt wurde, behebt dieses Erweiterungsproblem nicht (obwohl zumindest einige Dinge zur Typensicherheit getan werden).

Der einzige Vorteil von enum ist, dass es sie nicht gibt: Sie bieten eine gewisse Typsicherheit, während sie keinen Laufzeit-Overhead verursachen, da sie vom Compiler direkt ersetzt werden.

Wenn Sie ein solches Biest wollen, müssen Sie selbst arbeiten:

  • erstellen Sie eine Klasse MyEnum, die ein int enthält (im Grunde genommen)
  • erstellen Sie benannte Konstruktoren für jeden der interessanten Werte

sie können jetzt Ihre Klasse beliebig erweitern (benannte Konstruktoren hinzufügen) ...

Das ist zwar ein Workaround, ich habe noch nie einen satistifizierenden Weg gefunden, mit einer Aufzählung umzugehen ...

58
Matthieu M.

Wenn Sie eine Unterklasse einer Enumeration erstellen konnten, müsste dies andersherum funktionieren.

Die Menge der Instanzen in einer Unterklasse ist eine Teilmenge der Instanzen in der Oberklasse. Denken Sie an das Standardbeispiel "Shape". Die Shape-Klasse repräsentiert die Menge aller Shapes. Die Circle-Klasse, ihre Unterklasse, repräsentiert die Teilmenge der Shapes, die Kreise sind.

Um konsistent zu sein, müsste eine Unterklasse einer Enumeration eine Teilmenge der Elemente der Enumeration enthalten, von der sie erbt.

(Und nein, C++ unterstützt das nicht.)

7

Ich habe auf diese Weise gelöst:

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

Wenn Sie der Datei NetProtocols.def ein neues Netzprotokoll hinzufügen, müssen Sie das natürlich neu kompilieren, aber es ist zumindest erweiterbar.

7
marco

http://www.codeproject.com/KB/cpp/InheritEnum.aspx führt eine Methode aus, um eine erweiterte Enumeration zu erstellen.

2
BadPirate

Eine einfache, aber nützliche Problemumgehung für diese C++ - Lücke könnte folgendermaßen aussehen:

#define ENUM_BASE_VALS A,B,C
enum Enum {ENUM_BASE_VALS};
enum EnumEx {ENUM_BASE_VALS, D,E,F};
0
Marat

Nur eine Idee:

Sie können versuchen, für jede Konstante eine leere Klasse zu erstellen (möglicherweise alle in dieselbe Datei zu packen, um Unordnung zu vermeiden), eine Instanz jeder Klasse erstellen und die Zeiger auf diese Instanzen als "Konstanten" verwenden. Auf diese Weise wird der Compiler die Vererbung verstehen und alle ChildPointer-in-ParentPointer-Konvertierungen durchführen, die bei Funktionsaufrufen erforderlich sind. Außerdem erhalten Sie vom Compiler immer noch Typschutzprüfungen, um sicherzustellen, dass niemand einen ungültigen int-Wert an Funktionen übergibt zu verwenden, wenn Sie die Methode LAST verwenden, um die Aufzählung zu "erweitern".

Ich habe dies nicht vollständig durchdacht, daher sind alle Kommentare zu diesem Ansatz willkommen.

Und ich werde versuchen, ein Beispiel zu posten, was ich meine, sobald ich etwas Zeit habe.

0
elatalhm