Benannte Zustände mit enum class
Eine Enumeration oder Aufzählung benennt eine endliche Auswahl von Werten. enum class erzeugt einen eigenen Typ mit qualifizierten Namen. Das eignet sich etwa für Auftragszustände, Richtungen oder Menüaktionen.
Benannte Zustände mit enum class#
Eigene Datentypen und Klassen · Lektion 39 von 60
Voraussetzungen: switch, Eigene Typen. Lernziel: Du ersetzt unerklärte Zustandscodes durch einen eigenen Typ.
Eine Enumeration oder Aufzählung benennt eine endliche Auswahl von Werten. enum class erzeugt einen eigenen Typ mit qualifizierten Namen. Das eignet sich etwa für Auftragszustände, Richtungen oder Menüaktionen.
1#include <iostream>2 3enum class Status {4 offen,5 inArbeit,6 fertig7};8 9const char* bezeichnung(Status status) {10 switch (status) {11 case Status::offen: return "Offen";12 case Status::inArbeit: return "In Arbeit";13 case Status::fertig: return "Fertig";14 }15 return "Unbekannt";16}17 18int main() {19 Status status{Status::offen};20 status = Status::fertig;21 std::cout << bezeichnung(status) << '\n';22}Status::offen ist eindeutiger als die Zahl 0. const char* liefert hier einen Zeiger auf die Zeichen eines Stringliterals. Diese Literale bleiben während des Programms verfügbar, deshalb entsteht keine Referenz auf einen beendeten lokalen String.
Warum enum class?#
Im Unterschied zur traditionellen unqualifizierten Enumeration werden die Namen innerhalb des Aufzählungstyps verwendet. Außerdem erfolgt keine beliebige implizite Umwandlung in eine Ganzzahl. Damit werden versehentliche Vergleiche zwischen fremden Zustandsarten erschwert.
Der zugrunde liegende Typ ist der Ganzzahltyp für die interne Darstellung. Er kann ausdrücklich gewählt werden. Für normale Zustände brauchst du seine konkreten Zahlenwerte häufig nicht. Wenn Daten dauerhaft gespeichert oder übertragen werden, definiere eine stabile Abbildung statt zufällige Werte als dauerhaftes Format zu behandeln.
Externe Werte validieren#
Ein Cast von einer externen Zahl zu einer Enumeration garantiert nicht, dass der Wert einem benannten Aufzählungswert entspricht. Prüfe eingelesene Zahlen oder Texte ausdrücklich und ordne nur bekannte Werte zu.
Ein switch ohne default kann Compilerwarnungen zu neu hinzugefügten, noch unbehandelten Zuständen ermöglichen. Das Beispiel hat anschließend eine Rückgabe für unbekannte Werte. Wähle diese Strategie bewusst; bei externen Daten bleibt eine vorgelagerte Prüfung wichtig.
Best Practice#
Verwende bool für genau eine Ja/Nein-Aussage. Sobald drei oder mehr fachliche Zustände existieren, ist eine Enumeration oft klarer als mehrere Boolesche Variablen mit verbotenen Kombinationen. offen=true und fertig=true könnten sich sonst widersprechen.
Übung#
Warum ist Status status = 2; bei enum class kein normaler gültiger Ersatz für Status::fertig?
Lösung
Die Ganzzahl wird nicht implizit in den eigenen Aufzählungstyp umgewandelt. Verwende den benannten Wert oder prüfe und übersetze externe Daten ausdrücklich.
Weiterlernen#
Zurück: Zusammengehörige Daten mit struct bündeln · Kursübersicht · Weiter: Klassen, Kapselung und gültige Zustände
Kommentare 0
Kommentare sind für diese Seite deaktiviert.