Automatischer "Wrapper"



  • @Wurstinator: Könntest du mal ein bisschen genauer auf dein Problem eingehen? Der Sinn deines Lösungsversuches verschränkt sich mir völlig.

    Und hier deswegen natürlich die obligatorische Frage: Was willst du eigentlich machen?



  • Wie genau willst du es denn haben?

    Es gibt eine Klasse aus einer Library. Diese möchte ich erweitern und verändern. Da ich aber nicht alle Methoden kenne und/oder aufrufen kann, bringt mir eine Vererbung nichts.



  • Wenn du diese Klasse verwenden willst, brauchst du deren Definition - egal auf welche Weise du sie nutzen willst. Und mit dieser Klassendefinition kannst du auch Vererbung einsetzen.



  • Öffentliche Vererbung ist nicht das richtige Mittel für Codewiederverwendung. Besonders von Bibliotheksklassen zu erben, die nicht dazu gedachte sind halt eich für kritisch. Es würde auch niemand empfehlen von std::vector zu erben.
    Ich würde es einfach per Hand machen. Ist zwar lästig aber es handelt sich hier ja um Einmalaufwand. Der geschriebene Code ist trivial und bedarf eigentlich keiner Wartung. Um wie viele Methoden handelt es sich denn?

    Es handelt sich übrigens dabei um ein Adapter bzw. Wrapper, das ist das gleiche.



  • Wurstinator schrieb:

    Hallo,
    ich weiß nicht genau, wie das gesuchte heißt (Adapter/Brücke/Wrapper ?).

    Angenommen ich habe folgende Klasse:

    class Small
    {
      public:
         void a() {/*...*/};
         void b() {/*...*/};
         void c() {/*...*/};
         void d() {/*...*/};
         void e() {/*...*/};
    };
    

    Was ich gerne hätte ist, dass eine zweite Klasse automatisch erstellt wird (ich also nicht jede Methode selber schreiben muss), die so aussieht:

    class Big
    {
      public:
        Small obj;
        void a() {obj.a;}
        void b() {obj.b;}
        void c() {obj.c;}
        void d() {obj.d;}
        void e() {obj.e;}
    };
    

    Geht das?

    Wenn die potentiellen Smalls immer das gleiche Schema haben, dann kannst Du es mit einem Template machen:

    template<typename S>
    class big
    {
        typedef S small_type;
        small_type obj;
        void a() {obj.a();}
        void b() {obj.b();}
        void c() {obj.c();}
        void d() {obj.d();}
        void e() {obj.e();}
    };
    

    Evtl noch mit einem Interface:

    struct big_interface
    {
        virtual void a() = 0;
        virtual void b() = 0;
        virtual void c() = 0;
        virtual void d() = 0;
        virtual void e() = 0;
        virtual ~big_interface() = 0; //impl nicht vergessen
    };
    
    template<typename S>
    class big : public big_interface
    {
        typedef S small_type;
        small_type obj;
        void a() {obj.a();}
        void b() {obj.b();}
        void c() {obj.c();}
        void d() {obj.d();}
        void e() {obj.e();}
    };
    


  • @ CStoll: Ich hab ja geschrieben, es wäre auch glaub ich mit Vererbung möglich. Nur wäre es dann um ein vielfaches schwerer.

    @ brotbernd: Sind ca. 40 Methoden 🙂
    Ich werd mal sehen, ob sich das mit Makros machen lässt.

    @ Tachyon: Das Problem ist ja nicht, dass ich das für mehrere Klassen machen möchte, sondern dass es für eine Klasse viel Aufwand wäre. Und bei einem Template müsste ich ja auch alle Methoden manuell schreiben, was ich mir ja möglcihst vereinfachen will.



  • Innerhalb der Forenzeit hättest du das Abschreiben aber auch geschafft. 😉
    Was ist an Vererbung schwerer? Was willst du außer Funktionen nachmachen und eigenen noch machen? Welche umbenennen? Löschen? Durch ein anderes Konzept ersetzen?



  • wxSkip schrieb:

    Was ist an Vererbung schwerer?

    Vererbung sollte nie zur Vermeidung von Tipparbeit eingesetzt werden.



  • Michael E. schrieb:

    wxSkip schrieb:

    Was ist an Vererbung schwerer?

    Vererbung sollte nie zur Vermeidung von Tipparbeit eingesetzt werden.

    Ich weiß ja nicht mal, um welche Art von Klasse es sich handelt, ob Vererbung hier vorgesehen ist. Mag sein, dass diese Frage nicht so zielführend ist, aber vielleicht wird Wurstinator ja mal ein bisschen genauer.

    Und schließlich weiß ich auch nicht, wozu man diese Klasse erweitern muss.



  • wxSkip schrieb:

    Innerhalb der Forenzeit hättest du das Abschreiben aber auch geschafft. 😉
    Was ist an Vererbung schwerer? Was willst du außer Funktionen nachmachen und eigenen noch machen? Welche umbenennen? Löschen? Durch ein anderes Konzept ersetzen?

    Hab mich schon gefragt, wann so ein Beitrag kommt :p
    Wenn ich das jetzt besser machen kann und nochmal zu so einem Problem komme, spare ich mir dann Zeit 🙂

    Ich hab schon über Vererbung nachgedacht und sie würde mir nichts erleichtern und auch den Code unschöner machen.
    Ich brauche keine Tipps, wie ich es mit anderen Möglichkeiten besser realisieren kann, sondern eben, wie ich den Wrapper möglichst einfach schreibe 🙂



  • Wurstinator schrieb:

    Ich brauche keine Tipps, wie ich es mit anderen Möglichkeiten besser realisieren kann [...]

    Vielleicht ist das so. Vielleicht auch nicht. Es gibt jedenfalls viele, die das denken. Und gerade bei Fragen a la "ich will die Quadratur des Kreises" fällt mir da ohne weiteren Kontext nichts zu ein. Compile-Zeit-Reflexion gibt es eben nicht in C++. Unter den Bedingungen bleibt iwie nicht viel übrig außer automatischer Code-Generierung.


Anmelden zum Antworten