enum in zwei Klassen gleich benutzbar, wie?



  • Hihi, so einfach geht das nicht. A ist schliesslich ein eigener Scope, du wirst also irgendwie den Qualifizierer mit angeben müssen.

    Probier mal folgendes aus:

    struct B
    {
       using A::EType;
    };
    

    Weiß nicht ob es funktioniert.

    Wenn du das auch nicht willst, bleibt nur die Ableitung von A. Aber das wäre wirklich dreckig, wenn es fachlich keinen Sinn macht und du nur auf das A:: verzichten willst,



  • Das funktioniert nicht, bleibt nur ein Define übrig und Vererbung fällt ja weg (es sei denn du hast in B eine Komposition, dann könntest ja von A privat erben).



  • @dragon50#
    Danke! Das mit dem define ist echt ein guter weg. Vielleicht ja auch der einzige?

    @others
    Das mit dem using hatte ich auch schon ausprobiert, doch klappt wie gesagt nicht.

    mfg.



  • joomoo schrieb:

    @dragon50#
    Danke! Das mit dem define ist echt ein guter weg. Vielleicht ja auch der einzige?

    Es ist kein guter Weg ...



  • @joomoo
    Was spricht den eigentlich dagegen, den Scope anzugeben?



  • warum?



  • 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 ..)



  • 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 😞

    mfg.



  • Wie wärs hiermit?

    struct A
    {
        enum EType { First };
    };
    
    struct B
    {
        B()
        {
            struct EType : public A
            {
                EType()
                {
                    elem = new A::EType();
                }
    
                ~EType()
                {
                    delete elem;
                }
    
                A::EType &operator()()
                {
                    return *elem;
                }
    
            private:
                A::EType *elem;
            } x;
    
            x() = EType::First;
        }
    };
    

    😃 :p



  • Ihr spinnt doch alle! 😃



  • Direkt wieder rummaulen, dass hamma gern. Er hat nur die Aufgabenstellung gelöst ;). Und selbst diese "Lösung" ist noch akzeptabler als der #define Quatsch.



  • .filmor schrieb:

    Er hat nur die Aufgabenstellung gelöst ;). Und selbst diese "Lösung" ist noch akzeptabler als der #define Quatsch.

    Naja, eigentlich will ich ja nicht von A ableiten... 🙄 Und diese Lösung finde ich viel schlimmer als das mit dem #define und sie funktioniert auch nicht besser als z.B. das mit dem typedef.

    mfg.



  • .filmor schrieb:

    😉

    .filmor schrieb:

    selbst diese "Lösung"

    Noch Fragen?



  • .filmor schrieb:

    .filmor schrieb:

    😉

    .filmor schrieb:

    selbst diese "Lösung"

    Noch Fragen?

    Ne 😃 Hab's nicht gemerkt 🙂

    mfg.



  • joomoo schrieb:

    Naja, eigentlich will ich ja nicht von A ableiten... 🙄

    Der Trick ist, dass nur die lokale Klasse von A ableitet, B aber nicht 🙂



  • Michael E. schrieb:

    joomoo schrieb:

    Naja, eigentlich will ich ja nicht von A ableiten... 🙄

    Der Trick ist, dass nur die lokale Klasse von A ableitet, B aber nicht 🙂

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

    mfg.



  • Und es wurde eine reine Compile-Time Angelegenheit in eine Laufzeitangelegenheit umgewandelt, find ich nicht wirklich akzeptabel.
    Das typedef löst das Problem mit dem Scope auch nur zu Hälfte und dabei die kleinere Hälfte.

    Ich würd einfach den Scope mitangeben, da mir die Zeit zu schade wäre mir über sowas Gedanken zu machen.



  • 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.


Anmelden zum Antworten