Ich bin ein Anfänger in der C ++ - Programmierung.
Heute stoße ich auf ein neues Thema: stark getippt enum
. Ich habe es ein bisschen recherchiert, aber bis jetzt kann ich nicht herausfinden, warum wir das brauchen und wozu es gut ist.
Zum Beispiel, wenn wir haben:
enum xyz{a, b, c};
/*a = 0, b = 1, c = 2, (Typical C format)*/
Warum müssen wir schreiben:
enum class xyz{a, b, c};
Was versuchen wir hier zu tun? Mein wichtigster Zweifel ist, wie man es benutzt. Könnten Sie ein kleines Beispiel nennen, das mich verständlich macht?
enum class Colours
undenum class Fruits
. Denn als ich den Code in VS 2010 geschrieben habe, wirft er einen Fehler"expects a defination or a tag name"
unterclass
.Auf dieser IBM Seite gibt es einen guten Artikel über Aufzählungen , der sehr detailliert und gut geschrieben ist. Hier sind einige wichtige Punkte auf den Punkt gebracht:
Die Aufzählungen mit Gültigkeitsbereich lösen die meisten Einschränkungen, die bei regulären Aufzählungen auftreten: vollständige Typensicherheit, genau definierter zugrunde liegender Typ, Umfangsprobleme und Vorwärtsdeklaration.
quelle
Werte von
enum class
sind wirklich vom Typenum class
, nichtunderlying_type
wie bei C-Aufzählungen.quelle
Die Aufzählungsklassen ("neue Aufzählungen", "starke Aufzählungen") behandeln drei Probleme mit herkömmlichen C ++ - Aufzählungen:
enums
implizit konvertieren inint
, was zu Fehlern führt, wenn jemand nicht möchte, dass eine Aufzählung als Ganzzahl fungiert.enums
exportieren ihre Enumeratoren in den umgebenden Bereich, was zu Namenskonflikten führt.enum
kann nicht angegeben werden, was zu Verwirrung und Kompatibilitätsproblemen führt und eine Vorwärtsdeklaration unmöglich macht.enum class
("starke Aufzählungen") sind stark typisiert und haben einen Gültigkeitsbereich:Wie gezeigt, funktionieren herkömmliche Aufzählungen wie gewohnt, aber Sie können sich jetzt optional mit dem Namen der Aufzählung qualifizieren.
Die neuen Aufzählungen sind "Aufzählungsklassen", da sie Aspekte traditioneller Aufzählungen (Namenswerte) mit Aspekten Klassen (Mitglieder mit Gültigkeitsbereich und Fehlen von Konvertierungen) kombinieren.
Die Möglichkeit, den zugrunde liegenden Typ anzugeben, ermöglicht eine einfachere Interoperabilität und garantierte Aufzählungsgrößen:
Es ermöglicht auch die Vorwärtsdeklaration von Aufzählungen:
Der zugrunde liegende Typ muss einer der vorzeichenbehafteten oder vorzeichenlosen Ganzzahltypen sein. Der Standardwert ist
int
.In der Standardbibliothek werden
enum
Klassen verwendet für:<system_error>
:enum class errc
;<memory>
:enum class pointer_safety { relaxed, preferred, strict };
<iosfwd>
:enum class io_errc { stream = 1 };
<future>
:enum class future_errc { broken_promise, future_already_retrieved, promise_already_satisfied };
Einige von diesen haben Operatoren, wie z. B.
==
definiert.quelle
Enum Scope
Aufzählungen exportieren ihre Aufzähler in den umgebenden Bereich. Dies hat zwei Nachteile. Erstens kann es zu Namenskonflikten kommen, wenn zwei Enumeratoren in unterschiedlichen Aufzählungen, die im selben Bereich deklariert sind, denselben Namen haben. Zweitens ist es nicht möglich, einen Enumerator mit einem vollständig qualifizierten Namen einschließlich des Aufzählungsnamens zu verwenden.
quelle