Frage zu enum



  • Hi eigentlich habe ich nicht direkt eine Frage sondern möchte er wissen ob meine Kommentare hier so richtig sind.

    #include <iostream>
    using namespace std;
    int main(int argc, char* argv[])
    {
    
    enum mon {jan ,feb }; // Erstellt in Array mit 2 Elementen im Speicher.
    
    mon obj(4);   // Legt eine weitere int Variable im Speicher an.
    
    cout<< obj <<endl;  // Gibt 4 aus.
    
    cout<<jan<<endl;  // Gibt 0 aus.
    cout<<feb<<endl; // Gibt 1 aus.
    
    system("PAUSE");
    }
    //---------------------------------------------------------------------------
    


  • Hässlich und falsch.

    #include <iostream>
    
    enum mon
    {
        jan ,
        feb
    }; // Definiert ein enum "mon"
    
    int main()
    {
        mon obj(jan);   // Legt ein Enum vom Typ "mon" mit Wert "jan" im Speicher an.
    
        std::cout << obj << '\n'  // Gibt 0 aus.
                  << jan << '\n'  // Gibt 0 aus.
                  << feb << '\n'; // Gibt 1 aus.
    }
    

    So, schonmal richtig. Jetzt noch formattieren lernen. 🙂
    Vielleicht interessiert dich noch sowas:

    enum class {...}; // C++11
    


  • Hacker schrieb:

    Vielleicht interessiert dich noch sowas:

    enum class {...}; // C++11
    

    Bringt ihm unglaublich viel ohne Erkärung oder Stichwort.



  • Deine Erklärung war dafür umso aufschlussreicher, PI 🙂
    Abgesehen davon ist mit "enum class" bereits das beste Stichwort in Hackers Post enthalten.

    Zur Info:
    enum classes sind typsichere Enumerationstypen, grob gesagt. Können zwar ein klein wenig mehr, aber das ist der Hauptvorteil.



  • Wenn Hacker sie erwähnt, ist es nicht meine Aufgabe, zu erklären.



  • 314159265358979 schrieb:

    Hacker schrieb:

    Vielleicht interessiert dich noch sowas:

    enum class {...}; // C++11
    

    Bringt ihm unglaublich viel ohne Erkärung oder Stichwort.

    Hey, Google's Server funktionieren noch. 😃

    Edit: Gut, gut, ich erbarme mich. So etwas nennt sich strongly typed enumerations, ist ein C++11 Sprachfeature und nützlich aufgrund seiner Typsicherheit, da man Instanzen einer solchen Enumeration nicht implizit (merke: implizit! Nicht explizit, das geht "noch") in die integralen Typen ihrer Aufzählung (standardmäßig int ) konvertieren kann.

    enum struct test_enum //struct oder class wie immer egal, und hier vollkommen
    {
      first = 1,second,third
    };
    
    bool is_third(test_enum to_check)
    {
       return to_check == test_enum:third;
    }
    

    Zudem muss jetzt dabei der Scope-Operator benutzt werden, um auf einen Status oder Wert eines Enums zuzugreifen.

    Ein Vorteil ist einerseits die Inkompabilität eines Enums zum Anderen (Vergleichsoperator, wobei hier wieder das explizite Casten "weiterhilft", auch wenn man es nie brauchen wird), und auch die Möglichkeit einer Vorwärtsdeklaration.
    Noch ein Feature (das auch normale Enumerationen betrifft) ist das festlegen eines Typs, dieser muss integral sein:

    enum test_enum : unsigned short
    {
        first
    };
    

    Die einzelnen Werte innerhalb von Bla sind nun unsigned shorts.



  • Ty für eure Antworte ich hab auch gerade nochmal in meinem Buch nachgeschaut.

    Da warnt der Autor hiervor:

    mon obj(4);
    

    So wie ich es verstanden haben entsteht dort eine Implizite Typeumwandlung. Und deshalb soll man sowas vermeiden.



  • enum schrieb:

    Ty für eure Antworte ich hab auch gerade nochmal in meinem Buch nachgeschaut.

    Da warnt der Autor hiervor:

    mon obj(4);
    

    So wie ich es verstanden haben entsteht dort eine Implizite Typeumwandlung. Und deshalb soll man sowas vermeiden.

    😕 Das kompiliert doch überhaupt gar nicht erst.



  • Gugelmoser schrieb:

    enum schrieb:

    Ty für eure Antworte ich hab auch gerade nochmal in meinem Buch nachgeschaut.

    Da warnt der Autor hiervor:

    mon obj(4);
    

    So wie ich es verstanden haben entsteht dort eine Implizite Typeumwandlung. Und deshalb soll man sowas vermeiden.

    😕 Das kompiliert doch überhaupt gar nicht erst.

    👍 Deswegen ließ ich es auch bei der "richtigen" Angabe oben raus. Wahrscheinlich hat der Autor einen krüppeligen Compiler (ich wette um 50ct, dass MSVC das compiliert).



  • Ich nehme die Wette an. Wann kriege ich mein Geld?

    Merke: Blindes MS- und VC-Bashing kann nach hinten losgehen.



  • Und wenn du noch Pseudo-Namen wie foo, bar, baz und qux verwenden würdest, könnte man deinen Code auch leicht verstehen, lieber Hacker.



  • 314159265358979 schrieb:

    Und wenn du noch Pseudo-Namen wie foo, bar, baz und qux verwenden würdest, könnte man deinen Code auch leicht verstehen, lieber Hacker.

    Natürlich, lieber PI. Habe ich soeben korrigiert, vielen dank. Achte auch künftig auf solche Banalitäten. Einen schönen Dienstag dir noch. Küsschen. 😋 Dein Hacker. 🙂


Log in to reply