Zugriff auf enum in einer Klasse



  • habe gerade ein kleines Verständnisproblem aus meinem Buch

    #include <iostream>
    
    class Ampel {
    
        public:
            enum Status { aus, rot, gruen, gelb };
    
        private:
            Status status;
    
        public:
            Ampel( Status s = aus) : status(s) {}
            Status getStatus() const { return status; }
    
            void setStatus( Status s) {
                switch(s) {
                    case aus:   std::cout << "\nAUS\n"; break;
                    case rot:   std::cout << "\nROT\n"; break;
                    case gruen: std::cout << "\nGRUEN\n"; break;
                    case gelb:  std::cout << "\nGELB\n"; break;
                }
                status = s;
            }
    };
    
    int main() {
    
        std::cout << "Einige Anweisungen mit Ampel-Objekten!\n" << std::endl;
    
        Ampel A1, A2(Ampel::rot);
        Ampel::Status as;
    
        as = A2.getStatus();
    
        if( as == Ampel::rot) {
            A1.setStatus( Ampel::rot);
            A2.setStatus( Ampel::gelb);
        }
        std::cout << std::endl;
        return 0;
    }
    

    warum muss das "Ampel::rot" und nicht einfach "rot" heißen, wenn ich A2 anlege?



  • Jede Klasse definiert auch einen eigenen Gültigkeitsbereich. Der eingeführte enum-Typ (Status) ist nur innerhalb dieses Gültigkeitsbereiches bekannt.

    Wenn der Compiler in deinem Code auf

    Ampel A1, A2(rot);
    

    treffen würde, dann würde er in dem aktuellen Gültigkeitsbereich (Fkt. main()) suchen und anschließend in den die Funktion main() umgebenden Gültigkeitsbereichen weitersuchen und nicht fündig werden. Dass du das rot aus dem Gültigkeitsbereich der Klasse Ampel meinst, kann der Compiler nicht wissen und auch nicht für dich entscheiden.



  • cpp_nap schrieb:

    ...
    warum muss das "Ampel::rot" und nicht einfach "rot" heißen, wenn ich A2 anlege?

    Eigenlich finde ich ja die Frage viel spannender, warum es nicht "Ampel::Status::rot" heißen muss ... 😉
    Das fände ich jedenfalls deutlich konsistenter.

    ... die Antwort fällt aber wohl unter die Kategorie "Hielten wir damals für eine gute Idee".

    Gruß,

    Simon2.



  • Simon2 schrieb:

    cpp_nap schrieb:

    ...
    warum muss das "Ampel::rot" und nicht einfach "rot" heißen, wenn ich A2 anlege?

    Eigenlich finde ich ja die Frage viel spannender, warum es nicht "Ampel::Status::rot" heißen muss ... 😉
    Das fände ich jedenfalls deutlich konsistenter.

    ... die Antwort fällt aber wohl unter die Kategorie "Hielten wir damals für eine gute Idee"...

    ... und wird im neuen Standard entsprechend umgeändert, was ich sehr sinnvol finde. Dann gehen für Enums beide Varianten und für die typisierte enum class nur die letztere.



  • Gate schrieb:

    Simon2 schrieb:

    Eigenlich finde ich ja die Frage viel spannender, warum es nicht "Ampel::Status::rot" heißen muss ... 😉
    Das fände ich jedenfalls deutlich konsistenter.

    ... und wird im neuen Standard entsprechend umgeändert, was ich sehr sinnvol finde. Dann gehen für Enums beide Varianten und für die typisierte enum class nur die letztere.

    Sehr begrüßenswert! 👍



  • Roger Wilco schrieb:

    Gate schrieb:

    Simon2 schrieb:

    Eigenlich finde ich ja die Frage viel spannender, warum es nicht "Ampel::Status::rot" heißen muss ... 😉
    Das fände ich jedenfalls deutlich konsistenter.

    ... und wird im neuen Standard entsprechend umgeändert, was ich sehr sinnvol finde. Dann gehen für Enums beide Varianten und für die typisierte enum class nur die letztere.

    Sehr begrüßenswert! 👍

    Stimmt! 😮 HEYHEY JIPPI JIPPI JAY! 👍 😋 🕶

    YEEEEEEEEEEEEEEEEEEEEHAAAAAAAAAAAAAAAAAAAAAAAAAA GOTT SE DANK! 😉



  • Gate schrieb:

    Simon2 schrieb:

    cpp_nap schrieb:

    ...
    warum muss das "Ampel::rot" und nicht einfach "rot" heißen, wenn ich A2 anlege?

    Eigenlich finde ich ja die Frage viel spannender, warum es nicht "Ampel::Status::rot" heißen muss ... 😉
    Das fände ich jedenfalls deutlich konsistenter.

    ... die Antwort fällt aber wohl unter die Kategorie "Hielten wir damals für eine gute Idee"...

    ... und wird im neuen Standard entsprechend umgeändert, ...

    👍 👍 👍 😋 😋 😋
    Wieder mal einen Tag mit einer guten Nachricht begonnen. 😃

    Gruß,

    Simon2.


Anmelden zum Antworten