enum

enum steht für Enumeration - Aufzählung. Mittels enum lassen sich Aufzählungen realisieren. zB könnte eine Datei folgende Stati haben: OpenForRead, OpenForWrite, OpenForReadWrite und Closed. Man könnte dies natürlich mit int machen: int const OpenForRead=1; int const OpenForWrite=2; ... Allerdings bietet enum die Möglichkeit einer Typenprüfen. Wenn wir nun zB File::Open() haben, können wir sagen dass File::Open ein enum vom Typ 'OpenMode' verlangt und somit kann der Anwender unseres Codes keine ungültigen Werte übergeben, da der Compiler checkt, ob der Parameter vom Typ 'OpenMode' ist.

    #include <iostream>
    using namespace std;

    enum MultiTypeType
    {
      Integer,
      Double,
      Character,
      Boolean
    };

    struct MultiType
    {
      MultiTypeType type;
      union
      {
        int Integer;
        double Double;
        char Character;
        bool Boolean;
      }
    };

    void setInt(MultiType& type, int value)
    {
      type.type = Integer;
      type.Integer = value;
    }

    void setDouble(MultiType& type, double value)
    {
      type.type = Double;
      type.Double = value;
    }

    void setChar(MultiType& type, char value)
    {
      type.type = Character;
      type.Character = value;
    }

    void setBool(MultiType& type, bool value)
    {
      type.type = Boolean;
      type.Boolean = value;
    }

    void printType(MultiType const& type)
    {
      switch(type.type)
      {
      case Integer:
        cout<<type.Integer;
        break;
      case Double;
        cout<<type.Double;
        break;
      case Character:
        cout<<type.Character;
        break;
      case Boolean;
        cout<<type.Boolean;
        break;
      }
    }

    int main()
    {
      MultiType type;

      setInt(type, 7);
      printType(type);

      setBool(type, false);
      printType(type);
    }
    

Diese Aufzählungen haben vorallem dann einen Sinn, wenn wir Statuswerte speichern wollen. Weiters können sie auch die Lesbarkeit des Codes stark verbessern:

    #include <iostream>
    #include <string> //für string
    using namespace std;

    enum PrintType
    {
      printNewline,
      printSpace,
      printNothing
    };

    void print(string const& str, PrintType type=printNewline)
    {
      cout<<str;
      switch(type)
      {
      case printNewline:
        cout<<'\n';
        break;
      case printSpace:
        cout<<' ';
        break;
      }
    }

    int main()
    {
      print("Hallo Welt");
      print("dies steht in der naechsten Zeile", printSpace);
      print("und dies auch.", printNothing);
    }
    

Würden wir zB bool verwenden um anzugeben ob eine neue Zeile angefangen werden soll oder nicht - wäre der Code schwerer zu lesen print("Hallo", false);.

top