frage zu enum benutzung
-
Hallo
ich habe eine klasse A
in dieser - public - ein enum WERTE wert1 = 0 wert2 = 1 usw
jetzt habe ich eine Setter Funktion als Parameter ( WERTE w )
ich kann jetzt eine int variable so benutzen
int z = Setfoo(wert2); // das geht
jetzt will ich aber nicht die Setter Funktion in der Klasse verwenden sondern im hauptprogramm main.cpp
dort mache ich ja
A a; a.Setfoo(wert2); // nichtdeklarierter Bezeichner
static geht nicht, will ich auch nicht verwenden. wie mache ich das jetzt?
-
Weis nicht ob ichs richtig verstanden hab, aber versuche mal a.Setfoo(A::Wert2)
-
wow danke!
hab ich so versucht, aber als ich
A::
eingegeben hatte, kam im pulldownmenu nicht die auswahl nur die methoden,variablen, und mein enum halt. komisch
ich habe dann
(A::WERTE = wert2) versucht, ging aber nicht.
hmm komisch. aber es passt ja
vielen dank nochmal
-
ich nochmals
hab da ein kleines using problem
ich habe benutzer die wissen es gibt 3 arten
user
master
administratorjetzt will der ja die fkt so aufrufen idr.
Setfoo(master);
sonst müsste er ja
Setfoo(A::master)
machen. kann man das umgehen, dass er halt nur (master) eingibt?
ist halt n using prob. denn nicht jeder kennt den scope operator "trick"
-
für die jenigen welche auch mal auf sowas stossen sollten, zur vervollständigung
ich hab das enum oberhalb der klasse ( also ausserhalb ) geschrieben, dann braucht man den scope operator nicht mehr. was anderes wusst ich jetzt auch nicht.
-
Du kannst die enum Definition ruhig in der Klasse lassen (sodern sie logisch auch dorthin gehört) und machst im Namensraum ein
using WERTE;
-
Wie meinst du das?
bsp
//.h Klasse A enum WERTE { user = 0; } //.cpp void A::Setfoo(WERTE w) { m_erste = w; } //main.cpp A a; a.Setfoo(user);
wie definiere ich da den namensraum? in der main.cpp steht dann oben einfach ein
using WERTE;
und das wars?
hast du so eine kurzeinleitung für ein namespace?
-
Wenn mans so sehen will schafft das Enum einen eigenen Namesapce den du mit Using umgehen kannst.
-
enumnoob schrieb:
wie definiere ich da den namensraum?
Definieren? Du kannst lediglich einen Namensraum öffnen bzw. ein Alias erstellen. Mehr zu Namensräumen findest du in jedem guten Tutorial.
enumnoob schrieb:
in der main.cpp steht dann oben einfach ein
using WERTE;
Im Grunde, ja. Du musst halt nur beachten, wo WERTE definiert wurde. Wenn zB in der Klasse A, dann schreibst du
using A::WERTE;
Das ist praktisch so, wie wenn du die Definition von A::WERTE nochmal im aktuellen Namensraum hättest. Ist kein Namensraum geöffnet, dann bezieht sich das auf den globalen Namensraum.
-
ich bin nah dran, oder?
ich hab jetzt das denum in die .h in die klasse unter public geschrieben
so wie es in einem guten c++ buch steht
namespace{ enum ... ... } oder auch namespace TEST{ enum .... }
da bring der compiler mir gleich fehler
Syntaxfehler : 'namespace'
error C2334: Unerwartete(s) Token vor '{'; sichtbarer Funktionsrumpf wird übersprungen
-
enumnoob schrieb:
da bring der compiler mir gleich fehler
Da bin ich leider überfragt, denn an deinem Code ist soweit nichts falsch. Vielleicht kannst du noch etwas mehr Code posten.
Oder hast du etwa den Namensraum innerhalb der Klasse geöffnet? Das wäre nämlich falsch.
-
Ja in der klasse
ne oder?
kannst du mal so ein musterbsp nennen?
-
So, hab jetzt nochmal nachgeschaut. Scheint leider so zu sein, dass enum's in Klassen mit using nicht funktionieren. Verwundert mich zwar etwas, wie auch immer. Dann bleibt halt nur noch die Möglichkeit mit Namensräumen, wenn wir es kapseln wollen.
namespace A { enum B { user, master, administrator }; } // namespace A // normalerweise muessten wir jetzt immer A::... schreiben, um die enum Bezeichner bzw. den Typ selbst anzusprechen // dank using koennen wir uns das aber sparen using A::B; using A::master; void foo() { B a = master; // OK //... }
Wobei man dann natürlich über Sinn und Unsinn diskutieren kann, und ob man nicht einfach den enum Typ global definiert.
Vielleicht kann man auch nochmal darüber nachdenken, ob es wirklich zuviel verlangt ist, dass ein Benutzer A::... schreibt.
-
Vielleicht kann man auch nochmal darüber nachdenken, ob es wirklich zuviel verlangt ist, dass ein Benutzer A::... schreibt.
ich finds immer toll, wenn ich "gezwungen" werde, sowas zu schreiben, da es dann einerseits keinerlei namenskonflikte geben kann, ich aber andererseits auch immer sehe, was wozu gehört.