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
    administrator

    jetzt 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. 👍


Anmelden zum Antworten