Tracks
/
C++
C++
/
Lehrplan
/
Aufzählungen
Au

Aufzählungen in C++

1 Übung

Über Aufzählungen

Enumerationen

Bisher haben wir uns überwiegend mit Zahlen und Strings beschäftigt. Um die reale Welt abzubilden, brauchen wir vielleicht eine begrenzte Anzahl von Werten, die eine Variable annehmen kann. Du möchtest vielleicht einen eigenen Typ mit einigen wenigen unterschiedlichen Werten und jeweils eigenen Namen. Zum Beispiel in einer Skateboardfabrik, wo das Deckmaterial nur maple, bamboo oder plastic sein kann.

Du könntest Ganzzahlen verwenden, um diese Werte zu kodieren, aber du müsstest zusätzlichen Code schreiben, um zu prüfen, ob vom System ein ungültiger Wert für das Material kommt. Die Bedeutung dieser magischen Zahlen lässt sich im Quellcode schwer nachvollziehen, und sie sind anfällig für Verwechslungen. Man kann enumerations verwenden, um ausdrucksstarken Code zu fördern und unbeabsichtigte Vergleichsfehler einzudämmen.

Beispielhafte Verwendung

Der Fachbegriff für diese Art von Enumeration ist scoped enumeration. Das folgende Snippet zeigt, wie du eine DeckMaterial enumeration schreibst. Beachte das Schlüsselwort enum class und das ; am Ende der Definition:

enum class DeckMaterial {
    maple,
    bamboo,
    plastic
};

Schau dir nun eine Preisfunktion im Skateboardladen an und beachte den Bereichsauflösungsoperator (::), der einen enumerator aus der enumeration angibt:

double deck_price(double base_price, DeckMaterial material) {
    if(material == DeckMaterial::plastic) {
        return base_price * 0.9;
    }
    return base_price * 1.3;
}

Gültigkeitsbereich

Stell dir vor, du hast eine zweite enumeration für Radmaterial:

enum class WheelMaterial {
    steel,
    clay,
    plastic
};

Obwohl die Rollen und das Deck beide aus plastic bestehen können, sind die beiden nicht zu verwechseln. Sie sind verschiedene Typen: DeckMaterial plastic und WheelMaterial plastic. Jede enumeration hat ihre enumerators in ihrem eigenen Gültigkeitsbereich, ihrem eigenen namespace. Deshalb heißen sie scoped enumerations.

Advanced

Enumerationen ohne Gültigkeitsbereich

Du denkst vielleicht, dass es bei einem Namen wie scoped auch unscoped Enumerationen geben müsste, und du hast recht. Unscoped enumerations werden weniger beliebt, weil sie sich alle denselben globalen namespace teilen. Wegen dieser gemeinsamen Nutzung könntest du nicht zwei unscoped enumerations mit denselben enumerators wie plastic im obigen Beispiel haben.

Außerdem werden unscoped enumerations implizit in Ganzzahlen umgewandelt. Schau dir das folgende Beispiel für ein überraschendes Ergebnis an:

enum CitrusFruits {
    lemons,  // 0
    oranges, //1
};

enum IceCream {
    walnut,  // 0
    apples,  // 1
};

bool comparison{apples == oranges};
// => true

// Example from above:
bool comparison{DeckMaterial::plastic == WheelMaterial::plastic};
// => Does not compile!

Wenn du scoped enumerations in Ganzzahlen umwandeln möchtest, kannst du static_cast<int> verwenden.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Aufzählungen

Das Üben ist gesperrt

Schalte 1 weitere Übung frei, um Aufzählungen zu üben