Was ist (ein?!) "Delegate" in C++ ?



  • Hiho,

    sorry, wenn die Frage etwas doof vormuliert ist, aber was ist das (ein 'Delegate'), habs noch nie gehört 🕶 ...

    ->x.h.T.h.x.<- 🕶



  • glaub in c++ ist der begriff "wrapper" üblicher. ein delegate ist ein entwurfsmuster. eine wrapper klasse delegiert funktionsaufrufe an ein memberobjekt. wird gern statt einer ableitung verwendet, wenn ableiten zu unerwünschten seiteneffekten führen könnte oder nicht in das eigentlich konzept passt und vielleicht polymorphie stört. simples beispiel:

    class Shape {
     public:
     virtual void draw();
    };
    
    class Triangle : public Shape {
     public:
     void draw(){
      // zeichne ein dreieck
     }
    };
    
    class Circle : public Shape {
     ProprietaryCircleObject *circle;
     public:
     void draw(){
      circle->GraphicalOutput(); // delegiert den aufruf an circle
     }
    };
    
    int main() {
     vector<Shape*> v;
     v.push_back(new Triangle());
     v.push_back(new Circle());
     for(unsigned i = 0; i < v.size(); ++i) {
      v[i]->draw(); // shape objekte können hier polymorph verwendet werden
     }
    }
    


  • Ein "Delegate" ist das Pendant zum Funktionspointer!
    Der einzige unterschied liegt darin das man mit einem Delegate
    auf Funktionen einer Klasse referenzieren kann...
    Wikipedia hilft...einfach mal "Delegate" und dann unter C-Sharp...



  • Basingstoke schrieb:

    Ist ein "Delegate" nicht das Pendant zum Funktionspointer?!

    kurz gesagt: nö. sehe keinen zusammenhang zwischen nem delegate und einem funktionspointer.



  • thordk schrieb:

    Basingstoke schrieb:

    Ist ein "Delegate" nicht das Pendant zum Funktionspointer?!

    kurz gesagt: nö. sehe keinen zusammenhang zwischen nem delegate und einem funktionspointer.

    http://www.codeproject.com/cpp/FastDelegate.asp



  • thordk schrieb:

    Basingstoke schrieb:

    Ist ein "Delegate" nicht das Pendant zum Funktionspointer?!

    kurz gesagt: nö. sehe keinen zusammenhang zwischen nem delegate und einem funktionspointer.

    Dann hast du mindestens eines der 2 Konzepte nicht verstanden.



  • kannte die auslegung von "delegate" nicht.

    natürlich könnte man jetzt argumentieren, dass man funktionspointer verwenden könnte, um ein delegate pattern zu implementieren. das macht funktionspointer aber nicht zu einem delegate, sondern lediglich zu einer dafür verwendeten methode.





  • thordk schrieb:

    kannte die auslegung von "delegate" nicht.

    natürlich könnte man jetzt argumentieren, dass man funktionspointer verwenden könnte, um ein delegate pattern zu implementieren. das macht funktionspointer aber nicht zu einem delegate, sondern lediglich zu einer dafür verwendeten methode.

    wurde ja auch nicht gesagt, dass funktionspointer delegates sind, sondern dass delegates verwendet werden, um memberfunktionen als funktionen zu wrappen



  • AFAIK gibt es kein klar definiertes "delegate pattern". Unterschiedliche Leute/Sprachen/Papers/Bücher/... meinen unterschiedliche Dinge damit.

    Es gibt die Auslegung "Funktionszeiger", an anderen Stellen ist aber gleich ein ganzes Interface gemeint, an wieder anderen Stellen das was thordk beschrieben hat, nämlich einfach ein Objekt welches ein oder mehrere andere verwendet die den Grossteil der Arbeit erledigen.

    Am besten man vermeidet den Begriff gleich ganz.



  • hustbaer schrieb:

    Am besten man vermeidet den Begriff gleich ganz.

    zu function pointer passt der aber ganz gut, auch wenn nicht alle sprachen function pointers haben, aber irgendeine entsprechung haben sie meistens, wenn auch nur ein 'GOTO 100*a+b' o.ä. ...
    🙂


Anmelden zum Antworten