Übersichtlichere Enums
-
Hallo,
mich stört an den C++ Enmus, dass die Werte alle im globalen Namespace liegen. Also wenn ich ein enum Format { LEFT, RIGHT }; habe, dann kann ich ja schreiben
Format foo = LEFT; Nur besteht bei dem LEFT überhaupt kein Bezug mehr zu Format. Ich würde gerne eine Art enum wie in C# haben, wo man sowas schreibt:
Format foo = Format.LEFT;Wie setzt man das am besten in C++ um?
-
namespace Format { enum format { ... }; } ... Benutzung: if(bla == Format::BLA) ...
-
Missbrauche ich da nicht das Konzept von Namespaces?
In meinem Projekt hab ich einen "Ober"-Namespace (nennen wir ihn mal ProjectNS) und darunter mehrere zur feineren Unterteilung (z.B: Util). Eine Klasse heißt beispielsweise ProjectNS::Util::Text2D und ne andre ProjectNS::Input::Keyboard.
Wäre es da nicht vom Design mies "künstliche" neue Namespaces einzufügen, nur um die Enums besser nutzen zu können?
-
evtl
struct Format { enum { LEFT, RIGHT } };?
-
Jo, das sieht gut aus.
Eine kleine Zusatzfrage:
Wieso meckert der Compiler hier bei der Deklaration von method?class Foo { public: enum bar { left, right }; void method(Foo::bar var); };
-
Hm bei meinem VC++ 2003 gehts locker durch
Was sagt er denn?
-
Bei diesem Code:
class Foo { public: void method(Foo::Bar f) { } enum Bar { blau, rot}; };krieg ich diesen Fehler:
Fehler 1 error C2061: Syntaxfehler: Bezeichner 'Bar' e:\programmieren\c++\directx 9\alpha framework v9\main.cpp 24
-
Vielleicht reicht schon das vertauschen der beiden Zeilen, sonst ist Foo::Bar noch nicht bekannt in der Methode.
-
KPC schrieb:
Vielleicht reicht schon das vertauschen der beiden Zeilen, sonst ist Foo::Bar noch nicht bekannt in der Methode.
Zumindest beim VC2005 ist das der Fall.
Alternativ (kenne ich von einem Problem mit einem alten Compiler):
In der Deklaration der Methode Foo::Bar durch Bar ersetzen (in der Definition aber vollständig angeben).cu André
-
Warum ist denn das enum so schlecht? Warum ist es nicht gleich so wie der Threadersteller (und ich) es uns wünschen?