Stark Aufzählungen in C ++ typisierten

Die Programmierung ist über die Lesbarkeit. Es ist schwierig, (eigentlich ist es unmöglich) zu schreiben und ein Programm halten, die Sie nicht lesen können. Teil einer Sourcecode-Auflistung zu lesen ist zu verstehen, was die Zahlen im Programm verwendeten darstellen. Die einfachste Hilfsmittel, das C ++ bietet, ist die allgegenwärtige #definieren, wie im folgenden oft zitierten Beispiel:

#define PI 3.141592653589793

Diese Lösung ist in Ordnung für Einzelwerte, auch wenn es sich aus der Tatsache leidet, daß die #definieren Mechanismus nicht (genau genommen) ein Teil von C / C ++, da der Präprozessor vor dem Compiler ausgeführt wird. In Reaktion auf das eingeführte C ++ 2011 a konstanter Ausdruck bauen:

constexpr long double PI = 3.141592653589793-

Das Nachteiletausdr Stichwort bringt Konstanten in die C ++ Zelt. Dies PI hat eine echte Art, wie andere C ++ Variablen. C ++ kann mit Fehlermeldungen generieren PI dass viel mehr Sinn als diejenigen, denen 3,14159.

Konstante Ausdrücke sind in Ordnung für einzelne konstante Werte, aber oft Konstanten repräsentieren Sätze Dinge eher als Naturkonstanten, wie im folgenden Beispiel:

#define DC_OR_TERRITORY 0 # definieren ALABAMA 1 # definieren ALASKA 2 # definieren ARKANSAS 3 // ... und so weiter ...

Vermutlich sind diese Konstanten verwendet werden, um die Zustände zu identifizieren, möglicherweise als Index in ein Feld von Zustandsobjekte oder als Wert in einer Datenbank irgendwo verwendet wird.

C ++ ist seit langem einen verbesserten Mechanismus zur Festlegung dieser Art von Konstanten hatte - die Aufzählung:

Enum STATE {DC_OR_TERRITORY, // bekommt 0ALABAMA, // bekommt 1ALASKA, // bekommt 2ARKANSAS, // ... und so weiter ...} -

Das enum Schlüsselwort führt eine Folge von Konstanten eine "Aufzählung" genannt. In diesem Fall führt die Aufzählung den Namen BUNDESLAND. Jedes Element dieser Aufzählung wird Wert beginnend bei 0 zugeordnet und die Erhöhung sequentiell um 1, so DC_OR_TERRITORY definiert ist als 0, ALABAMA wird als 1 definiert, und so weiter. Sie können diese inkrementelle Sequenzierung außer Kraft setzen, indem Sie eine assign-Anweisung wie folgt:

Enum STATE {DC, TERRITORY = 0, Alabama, Alaska, // ... und so weiter ...} -

Diese Version von BUNDESLAND definiert ein Element DC, die den Wert gegeben ist 0. Es definiert dann ein neues Element GEBIET, die auch den Wert 0 zugeordnet. ALABAMA nimmt mit 1, so wie zuvor.

In der Praxis kann der Programmierer Aufzählungen verwenden sehr lesbaren Code wie folgt schreiben:

Doppel TaxRate (STATE s) {return taxRatesByState [s] -}

Das einzige Problem bei diesem Ansatz ist, dass diese Aufzählung nicht eine neue Art schafft (wie Sie vielleicht denken). In der Tat, nach dem Standard, BUNDESLAND ist nur ein anderer Name für int - und die Konstanten ALABAMA, ALASKA, und so weiter sind alle vom Typ const int.

Der gcc-Compiler tatsächlich stellt ein enum auf diese Weise ein wenig mehr Autorität erklärt, als einfach eine andere Aufruf Form int. Sie können Funktionen tatsächlich basierend Überlastung auf eine enum Art:

Leere fn (STATE s) -Lücke fn (int n) fn (ALASKA) - // ruft fn (STATE)

Die 2011-Standard ermöglicht es dem Programmierer eine völlig neue Art mit Hilfe der zu erstellen enum Stichwort. Da die Schöpfer des neuen Standards nicht vorhandenen Code zu brechen wollte, verlangt der Standard die Zugabe eines zusätzlichen Schlüsselwort, um einen Aufzählungstyp, wie im folgenden Beispiel zu definieren:

Enum-Klasse STATE {DC, TERRITORY = 0, Alabama, Alaska, // ... und so weiter ...} -

Eine Aufzählung Klasse ist jetzt ein Full-Scale-Typ wie jede andere benutzerdefinierte Klasse. Hier finden Sie nicht einmal legal mehr aus zwei Gründen:

int s = ALASKA-

Zuerst wird die Konstante ALASKA wird nur innerhalb der definierten BUNDESLAND Namespace. Somit ist der Name der Konstante STATE :: ALASKA. Zweitens ist der Typ nicht int aber BUNDESLAND. Sie können nicht einen Wert vom Typ zuordnen BUNDESLAND zu einem int.

STATE s = STATE :: ALASKA-

Der Programmierer kann eine Neufassung BUNDESLAND in eine int aber sie müssen dies tun, explizit -implicit Konvertierungen schneiden Sie es nicht mit Aufzählungsklassen:

int n = (int) STATE :: ALASKA-

Diese neue Aufzählungstyp kann auch auf einer der anderen Zählnummer Typen basieren neben nur int:

Enum-Klasse STAAT: char {DC, // ... der Rest der Erklärung ist die gleiche

Menü