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);.