Oft benötigt man mehrere Aufzählungstypen zusammen. Manchmal kommt es zu einem Namenskonflikt. Hierfür gibt es zwei Lösungen: die Verwendung eines Namensraums oder die Verwendung "größerer" Aufzählungselementnamen. Für die Namespace-Lösung gibt es zwei mögliche Implementierungen: eine Dummy-Klasse mit verschachteltem Enum oder ein vollwertiger Namespace.
Ich bin auf der Suche nach den Vor- und Nachteilen aller drei Ansätze.
例
// oft seen hand-crafted name clash solution
enum eColors { cRed, cColorBlue, cGreen, cYellow, cColorsEnd };
enum eFeelings { cAngry, cFeelingBlue, cHappy, cFeelingsEnd };
void setPenColor( const eColors c ) {
switch (c) {
default: assert(false);
break; case cRed: //...
break; case cColorBlue: //...
//...
}
}
// (ab)using a class as a namespace
class Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
class Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
// a real namespace?
namespace Colors { enum e { cRed, cBlue, cGreen, cYellow, cEnd }; };
namespace Feelings { enum e { cAngry, cBlue, cHappy, cEnd }; };
void setPenColor( const Colors::e c ) {
switch (c) {
default: assert(false);
break; case Colors::cRed: //...
break; case Colors::cBlue: //...
//...
}
}
19 Stimmen
Zunächst einmal würde ich Farbe::Rot, Gefühl:Wütend, etc. verwenden.
0 Stimmen
Gute Frage, ich habe den Namensraum method.... verwendet ;)
19 Stimmen
Die Vorsilbe "c" für alles beeinträchtigt die Lesbarkeit.
5 Stimmen
Beachten Sie, dass Sie die Aufzählung nicht benennen müssen wie in
enum e {...}
können Enums anonym sein, d. h.enum {...}
was viel mehr Sinn macht, wenn es in einen Namespace oder eine Klasse eingeschlossen ist.0 Stimmen
Wenn Sie ein unbenanntes enum haben, was ist sein Typ? z.B.: enum FOO{}; void bar(FOO e); aber wenn wir enum{} void bar2(???) haben;
0 Stimmen
@kralyk: Sie haben recht, aber nur für Klassen. Für Namespaces ist es besser, die Enums nicht-anonym zu halten, weil man den Namen des Namespaces selbst nicht als Typnamen verwenden kann; man kann nur den Namen des inneren Enums dafür verwenden.