Übergabe von Funktionen



  • Wie realisiert man eine Funktionsübergabe in C++?

    void Foo(Funktion_hier_übergeben)
    {
       Funkion_hier_übergeben();
    }
    

    mfg



  • TravisG schrieb:

    Wie realisiert man eine Funktionsübergabe in C++?

    void Foo(Funktion_hier_übergeben)
    {
       Funkion_hier_übergeben();
    }
    

    mfg

    void Foo(void(*Funktion_hier_übergeben)(void))
    {
       Funkion_hier_übergeben();
    }
    
    void func (void)
    {
      ...
    }
    
    ...
    Foo (func);
    ...
    

    🙂



  • danke.



  • Ich habe noch nie gesehen, dass eine Funktion übergeben wird.
    Warum sollte man das tun(Ich verstehe den Sinn nicht ganz!)?
    Könnt ihr mir das mal erläuter, oder habt ihr gar ein Beispiel???



  • kommt einfach immer andauernd irgendwo vor...
    zum beispiel hast du irgendeinen algorythmus implementiert, der elemente von einem beliebigen typ mit "größerGleich" sortieren soll. Bei int's und float's gehts ja mit eingebauten operatoren, für deine eigene datentypen musst du dann aber eine vergleichsfunktion definieren. Die vergleichsfunktion übergibst du dann einfach an deine algorithmus-funktion als parameter, und die algorithmus-funktion benutzt deine vergleichsfunktion, ohne zu wissen, wie die eigentlich funktioniert... sowas in der art beispielsweise...



  • wobei man das in der regel mit templates macht, damit man auch funktionsobjekte anstelle von funktionen übergeben kann (und das macht man u.a. deshalb, damit man zb. auch memberfunktionen aufrufen kann, wenn man das funktionsobjekt nur schlau genug macht).



  • Andrey schrieb:

    kommt einfach immer andauernd irgendwo vor...
    zum beispiel hast du irgendeinen algorythmus implementiert, der elemente von einem beliebigen typ mit "größerGleich" sortieren soll. Bei int's und float's gehts ja mit eingebauten operatoren, für deine eigene datentypen musst du dann aber eine vergleichsfunktion definieren. Die vergleichsfunktion übergibst du dann einfach an deine algorithmus-funktion als parameter, und die algorithmus-funktion benutzt deine vergleichsfunktion, ohne zu wissen, wie die eigentlich funktioniert... sowas in der art beispielsweise...

    sowas könnte man auch funktor nennen was wiederum ein objekt einer klasse ist.



  • queer_boy schrieb:

    wobei man das in der regel mit templates macht, damit man auch funktionsobjekte anstelle von funktionen übergeben kann (und das macht man u.a. deshalb, damit man zb. auch memberfunktionen aufrufen kann, wenn man das funktionsobjekt nur schlau genug macht).

    Naja, templates braucht man nicht dafür ... aber es stimmt schon: Wer soweit generalisiert, dass Funktoren praktisch sind, macht gleich noch den Schritt zum Template mit.
    Gruß,

    Simon2.



  • Im Moment brauch ich das für eine eigenes GUI Interface. So will ich ja z.B. dass der spätere Benutzer des Interfaces bestimmen kann, welche Funktion ausgeführt wird, wenn z.B. ein Button gedrückt wird:

    #include <iostream>
    
    class Button
    {
    public:
     Button(void (*func)(void)) { f = func; }; //Oder so ähnlich
     void click() { f(); };
    private:
     void (*f)(void); //Funktionszeiger zum speichern
    }
    
    //...
    void saySomething()
    {
      std::cout<<"USE YOUR VOICE!";
    }
    //...
    
    int main()
    {
     Button b(saySomething);
     while(ProgrammLäuft)
     {
       if(BenutzerKlicktAufButton)
       {
          b.click();
       }
     }
    }
    

    Warum ein eigenes GUI Interface entwickeln, obwohl es schon hunderte guter Exemplare gibt? Es gibt mehrere Gründe:

    Zum einen sind die meisten vorhandenen GUIs sehr überladen und benötigen Einarbeitungsaufwand, welchen ich nicht betreiben will, da ich nur eine winzige Komponente der GUI bräuchte (Buttons z.B.).

    Die Herausforderung. Ich habe das bisher noch nie gemacht und habe mir auch keine Quellen dazu "reingezogen". Ich will das jetzt mal "Do It Yourself" mäßig machen (Und schauen ob dabei was anständiges rauskommt).

    Dazu kommen dann noch kleinere Gründe - so wäre es ohne Einarbeitungszeit vielleicht nicht möglich einzelne GUI Komponenten von vorhandenen Bibliotheken einfach mal so abzuändern, sofern man eine Änderung braucht.

    Es ist um einiges Aufwändiger, als ich es mir vorgestellt hatte. Noch hatte ich mit den bisher fertig gestellten Modulen jedoch keine Probleme (Buttons, Menüeinträge (zum hin und herswitchen)), es hat aber schon Hirnschmalz gekostet.

    Oh, ich glaub ich hab zu weit ausgeholt.

    Eine Frage hätte ich noch: Funktionsübergaben gelten nicht zufällig als schlechter Stil, oder?



  • TravisG schrieb:

    Eine Frage hätte ich noch: Funktionsübergaben gelten nicht zufällig als schlechter Stil, oder?

    Nein, einige "state of the Art" techniken basieren darauf. desweiteren greifen große teile der stl auf sowas zurück(schau mal in <algorithm>)


Anmelden zum Antworten