Erweiterbares Enum
-
Morgen!
Ich habe ein Enum, das ein Speichersystem beschreibt:
enum MemClass { MEM_RS, MEM_AUDIO, MEM_AI }Was die Werte genau bedeuten ist nicht so wichtig. Das Enum nutze ich in einer Funktion void foo(MemClass mem); die abhängig vom Enum verschiedene Sachen macht und auch das Speichersystem als String auf die Konsole ausgibt.
In Pseudocode quasi sowas:case MEM_RS: // Tu was cout << "MEM_RS";Nun möchte ich aber, dass Benutzer meines Codes weitere Speicherklassen hinzufügen können. Sie sollen quasi ein eigenes MEM_XYZ definieren können und auch den dazugeführen String (also immer z.B. "MEM_FOO" für MEM_FOO).
Wie könnte man das machen?
-
Nein, das geht nicht. Aber du könntest die Zuständigkeiten neu verteilen und anstelle des enum eine (eventuell abstrakte) Basisklasse machen, die für alle Stellen, wo "abhängig vom Enum verschiedene Sachen" gemacht werden sollen, eine virtuelle Funktion bereitstellt. Dann wird aus Konstruktionen wie:
switch(memClass) { case MEM_RS: cout<<"MEM_RS"<<endl; break; ... }das wesentlich kürzere:
cout<<memClass.name()<<endl;
-
Aber wie mach ich dann die Aufrufe. Die Funktion foo(MemClass m) wird in Dutzenden Dateien aufgerufen. Ich muss dann ja an jeder Stelle ein Objekt parat haben. Das muss ich dann ja global machen?

Eigentlich brauche ich ja nur eine Konstante (#define oder Integer) und den String dazu, z.B:
MEM_FOO und "MEM_FOO".
-
Eulentier schrieb:
Aber wie mach ich dann die Aufrufe. Die Funktion foo(MemClass m) wird in Dutzenden Dateien aufgerufen. Ich muss dann ja an jeder Stelle ein Objekt parat haben. Das muss ich dann ja global machen?

Über Zeiger/Referenzen auf deine MemClass-Instanzen.
Eigentlich brauche ich ja nur eine Konstante (#define oder Integer) und den String dazu, z.B:
MEM_FOO und "MEM_FOO".Und was ist mit den zwei Dutzend weiteren Stellen, wo du auch solche
switch(memClass)Konstruktionen benötigst, um anhand der übergebenen Speicherklasse irgendwas zu machen?Aber wenn du wirklich sicher bist, daß du nur den Namen benötigst, könnte auch eine map<int,string> ausreichen
