enum in zwei Klassen gleich benutzbar, wie?



  • joomoo schrieb:

    dadurch würden ja aber trotzdem eventuelle Member von A erstellt oder?

    Das stimmt. Leider kann man dieses Problem auch nicht durch ein statisches Member lösen, weil lokale Klassen sowas nicht haben dürfen.

    Alles in allem sind alle Lösungen Kappes.



  • Hi!

    Das was du willst geht mit using, aber auch nur über Vererbung:

    struct A
    {
        enum EType { First };
    };
    
    struct B : public A {
    	using A::EType;
    
        B()
        {
            EType x = First;
        }
    };
    

    Statt public kannst du auch privat erben. Durch diese using-Deklaration wird jedes benannte Member aus der Basisklasse in den Gültigkeitsbereich der abgeleiteten Klasse eingeführt. (Habe es probehalber nochmal mit VS 2005 Std. compiliert.)



  • Sämtliche Alternativlösungen (zu meiner Define-Lösung) sind entweder unvollständig, misachten Design-Prinzipien oder fressen Laufzeit für eine rein stilistische Angelegenheit.
    Gesteht es ein für so etwas ist ein Define noch die beste Lösung. Das Problem ist ja kein richtiges Problem sondern nur eine rein stilistische Angelegenheit.



  • dragon90# schrieb:

    Sämtliche Alternativlösungen (zu meiner Define-Lösung) sind entweder unvollständig, misachten Design-Prinzipien oder fressen Laufzeit für eine rein stilistische Angelegenheit.
    Gesteht es ein für so etwas ist ein Define noch die beste Lösung. Das Problem ist ja kein richtiges Problem sondern nur eine rein stilistische Angelegenheit.

    Wieso? Das mit dem typedef ist doch besser?!

    mfg.



  • Jo stimmt, das mit dem typedef ist der gute Weg. Schade das es nicht mit dem using geklappt hat, denn jetzt muss man zwar nicht mehr A::EType schreiben aber dafür A::First

    Übrehaupt ist doch der Sinn eines enum das man einen scope hat.

    enum Fooo { xxxxx }; // einmal Fooo::xxxxx
    
    enum Baar { xxxxx }; // einmal Baar::xxxxx
    

    sonst kann man doch gleich statische Konstanten benutzen.
    Soll heisen: Es ist ein feature, kein bug 🙄



  • joomoo schrieb:

    dragon90# schrieb:

    Sämtliche Alternativlösungen (zu meiner Define-Lösung) sind entweder unvollständig, misachten Design-Prinzipien oder fressen Laufzeit für eine rein stilistische Angelegenheit.
    Gesteht es ein für so etwas ist ein Define noch die beste Lösung. Das Problem ist ja kein richtiges Problem sondern nur eine rein stilistische Angelegenheit.

    Wieso? Das mit dem typedef ist doch besser?!

    mfg.

    Nicht wirklich:

    //Deklaration
    EType myEnum = A::First;
    
    if( myEnum == A::First )
        myEnum = A::Second;
    //...
    

    Man spart den Scope nur bei der Deklaration ein, aber gerade da ist es ja egal, das muss man ja nur einmal pro Variable machen.



  • Jaha, das bekommt deine Variante aber auch nicht hin. Warum das typedef besser als der Präprozessor ist hab ich schon einmal geschrieben.
    Und jetzt ist mal bitte Ruhe hier... :p



  • Stimmt, hatte mein Define anders in Erinnerung.

    Man könnte aber folgendes machen:

    struct A
    {
        enum EType { First };
    };
    
    struct B
    {
        typedef A::EType EType;
        const int First = A::First;
        //const int Second = A::Second usw.
        B()
        {
            A::EType x = A::First; // klappt
            EType y = First; // EType undeclared
        }
    };
    


  • Dann kannste direkt

    struct B
    {
        enum EType
        {
            First = A::EType::First,
            Second = A::EType::Second
        }
    // ...
    };
    

    schreiben. Ich bin mir jetzt aber nicht ganz sicher, ob enum-Typen automatisch untereinander umgewandelt werden, müsste aber so sein...



  • Du schreibst zwei bis drei Zeilen mehr um drei Zeichen zu sparen 😮
    Wozu? 😕



  • Warum zum Henker liest du dir nicht den Thread durch, bevor du postest?! 😡



  • Ich _habe_ ihn gelesen, aber der Sinn ist mir dennoch schleierhaft.
    Kein Grund staubig zu werden.



  • .filmor schrieb:

    Probier mal den Code aus, den dragon da gepostet hat ...
    ⚠ BTW, es ist schon ziemlicher Quatsch, ein 3 Zeichen langes A:: durch zwei böse Codezeilen zu ersetzen ... ⚠

    /edit:
    Vielleicht ja so:

    struct B
    {
        typedef A::EType EType;
    // ...
    

    Immerhin kommts ohne Präprozessor aus und ist nicht so fehleranfällig (man denke nur an ein leicht vergessenes #undef ..)

    Das ist der letzte Post auf der ersten Seite. Nun lies dir mal genau die zweite Zeile durch und vergleich sie mit deinem Post. 🙄



  • Eben da stehts doch schon! Aber gut, ich halt mich raus..


Anmelden zum Antworten