Funtkionen als Parameter



  • Hallo an alle die mir helfen wollen. 😉
    Ich habe eine Frage und zwar wie kann ich eine Funktion als Parameter einer anderen Funktion übergeben, damit die Funktion die übergebene Funktione aufrufen kann.
    Also Funktion a bekommt als Parameter Funtkion b übergeben und ruft Funktion b auf. Hoffe ich habe mich verständlich ausgedrückt.



  • Das geht mit Pointern auf Funktionen oder auch Funktionspointern.



  • Das geht über mehrere Wege.

    Der eine, und für dich wohl besser geeignete Weg sind Funktionszeiger, sehr ausführlich zu beschreiben auf http://www.newty.de/fpt/index.html
    Die andere Möglichkeit wäre, dass du eine Referenz auf einen sog. Funktor (Funktionsobjekt) übergibst. Das sind Objekte von Klassen, die den ()-Operator überladen und dementsprechend reagieren.



  • Ein kleines Beispiel:

    // Zuerst definieren wir einen Funktionentyp.
    typedef void function_t();
    
    // Jetzt die Funktion, die einen Funktionszeiger nimmt.
    void foo(function_t* func)
    {
        func(); // Funktion aufrufen. 
    }
    
    void bar() { } // Eine Funktion...
    
    int main()
    {
        foo(&bar);
    }
    

    Gruß
    Don06



  • Brandy schrieb:

    Die andere Möglichkeit wäre, dass du eine Referenz auf einen sog. Funktor (Funktionsobjekt) übergibst. Das sind Objekte von Klassen, die den ()-Operator überladen und dementsprechend reagieren.

    Das Funktioniert ja so nicht. Du brauchst ja erstmal eine Basis-Klasse, die den ()-Operator virtuell macht. Dann kannst du davon abgeleitete Objekte übergeben. Dann kann man aber auch mit jeder beliebigen virtuellen Funktion arbeiten und braucht nicht den ()-Operator.

    Was auch nicht schlecht ist, wenn du beliebige Funktionen speichern willst ist boost Function. Aber schau dir erstmal Funktionspointer an.



  • ProgChild schrieb:

    Das Funktioniert ja so nicht.

    Was funktioniert so nicht? Und wie kommst du auf Polymorphie?



  • Don06 schrieb:

    Ein kleines Beispiel:

    // Zuerst definieren wir einen Funktionentyp.
    typedef void function_t();
    
    // Jetzt die Funktion, die einen Funktionszeiger nimmt.
    void foo(function_t* func)
    {
        func(); // Funktion aufrufen. 
    }
    
    void bar() { } // Eine Funktion...
    
    int main()
    {
        foo(&bar);
    }
    

    Gruß
    Don06

    was wäre das ganze ohne das typedef?
    functionpointer sind eins der wenigen sachen die mir syntax technisch absolut nicht einleuchten



  • Nexus schrieb:

    Was funktioniert so nicht? Und wie kommst du auf Polymorphie?

    Einfach eine Referenz auf ein Funktions-Objekt zu übergeben. Solange man keine Templates benutzt, was ich mal vorausgesetzt habe, gibt es keinen Typ für eine Referenz auf ein beliebiges Funktionsobjekt.



  • Skym0sh0 schrieb:

    was wäre das ganze ohne das typedef?
    functionpointer sind eins der wenigen sachen die mir syntax technisch absolut nicht einleuchten

    // Jetzt die Funktion, die einen Funktionszeiger nimmt.
    void foo(void (*func)())
    {
        func(); // Funktion aufrufen. 
    }
    
    void bar() { } // Eine Funktion...
    
    int main()
    {
        foo(&bar);
    }
    

    Felix :xmas1:

    EDIT: Zur Erklärung: Solche Deklarationen immer vom Namen (innen) her nach außen lesen, also:

    void (*func)()
    

    Der Name ist hier func, das * davor sagt dir schonmal, dass es ein Zeiger auf was auch immer (auf was steht weiter außen) ist. Dann haben die Postifx-Deklaratoren, also () und [] Vorrang vor allen anderen, weil wir außerhalb der Klammern ein () haben, ist es also ein Zeiger auf eine Funktion und deren Rückgabetyp ist void. Vielleicht noch ganz nützlich. http://www.newty.de/fpt/index.html (ehemals function-pointer.org)



  • ProgChild schrieb:

    Einfach eine Referenz auf ein Funktions-Objekt zu übergeben. Solange man keine Templates benutzt, was ich mal vorausgesetzt habe, gibt es keinen Typ für eine Referenz auf ein beliebiges Funktionsobjekt.

    Ah tut mir leid, ich hab nicht berücksichtigt, dass es sich um einen bestimmten Typ handelt. In diesem Falle stimme ich dir natürlich zu.


Anmelden zum Antworten