Funktionspointer auf Methoden???



  • Ich habe ein simples Problem. Ich brauche einen Funktionszeiger auf eine Methode. Bei normalen Funktionen sieht das ganze so aus:

    bool (*func)(int);
    func = Berechnung;
    //Berechnung ist: bool Berechnung(int i)

    Nun will ich einen Pointer auf diese Funktion, jedoch ist diese Funktion eine Methode (also in einer Klasse integriert). Ich bekomme dann immer eine Fehlermeldung.

    Was stört den Compieler, wie kann ich es umgehen oder wie wird es richtig gemacht?
    Vielen Dank im Voraus.



  • Den Compiler stört, daß deine Methode einen impliziten this-Parameter benötigt, als Lösung kannst du entweder Methodenzeiger (bool (Test::*func)(int)) verwenden oder eine statische Methode.



  • wenns keine statischen Methoden sind, sind diese ja an ein Objekt gebunden.
    Da gabs nen Syntax für, nur fällt mir der grade nicht ein 😕 Gibts irgendeinen Thread im C++ Board zu ...

    Der Zeiger lässt sich dann auch nur in Kombination mit einem Objekt verwenden



  • Vielen Dank erstmal, da werde ich es heut wohl nochmal probiern. Das Problem hat mich gestern den halben Tag gekostet 🙂



  • Schau mal in C++ FAQ, da ist ein Artikel über Methodenzeiger.



  • Wozu sind eigentich Zeiger auf Funktionen gut?



  • Zum Beispiel um sie an irgendwelche Algorithmen weiterzureichen:

    int calc_sum(vector<int> vals,int(*adder)(int,int),int s0)
    {
      int s=s0;
      for(int i=0;i<vals.size();++i)
        s=adder(s,vals[i]);
    }
    
    int add(int x,int y) {return x+y;}
    int mul(int x,int y) {return x*y;}
    int ggT(int x,int y) {/*euklid-Berechnung*/}
    ...
    
    vector<int> myvals;
    cout<<"Summe:  "<<calc_sum(myvals,add,0)<<endl;
    cout<<"Produkt:"<<calc_sum(myvals,mul,1)<<endl;
    cout<<"ggT:    "<<calc_sum(myvals,ggT,myvals[0])<<endl;
    

    die Funktion weiß nur, daß der adder zwei int-Parameter übernimmt und daraus einen neuen int berechnet - mehr muß sie nicht wissen. Der Aufrufer kann nun einen Pointer auf jede beliebige Funktion "int func(int,int)" übergeben und erhält das richtige Ergebnis.



  • Wenn du DLLs dynamisch lädst, brauchst auch Funktionszeiger


Anmelden zum Antworten