2016-12-28 3 views
1

Innerhalb einer nicht statischen Klasse, kann ich Funktionselemente direkt wie unten übergeben? Es meldet einige Fehler. Ich habe auch versucht, es zu ändern mystepper.do_step(this->rhs) Es funktioniert immer noch nicht. Aber wenn ich in die Hauptfunktion und rhs als Funktion setzen, funktioniert es gut. Wie kann ich dieses Problem beheben? Danke vielmals!Funktionselement als Parameter innerhalb einer Klasse übergeben C++

void Animal::rhs(const double x , double &dxdt , const double t) {  
      dxdt = 2*t; 
     }; 

void Animal::response() {  
    mystepper.do_step(rhs); 
} 

machte ich einige minimalistische Code meiner früheren question.Your Hilfe ist sehr willkommen zu illustrieren !!

#include <iostream> 

    using namespace std; 
    class ABC{ 
    private: 
     int x =3; 
     int add2num(int a, int b){ 
      return a+b+x; 
     } 

     int worker(int &fun(int a, int b), int a, int b){ 
      return fun(a,b); 
     } 
    public: 
     int doSomething(int a, int b){ 
      return worker(add2num, a, b); 
     } 
    }; 

    int main() { 
     ABC test; 
     cout << test.doSomething(3,5) << endl; 
     return 0; 
    } 
+1

Machen Sie es "statisch". – StoryTeller

+0

mache es 'statische Funktion' oder benutze' std :: bind' \ 'lambda function' um zu wissen, auf welchem ​​Objekt es aufgerufen werden soll. – paweldac

+0

Es funktioniert durch rhs als statische Funktion zu ändern! Aber was, wenn ich viele Parameter innerhalb von rhs habe, die sich in verschiedenen Instanzen unterscheiden, die von Animal initiiert wurden? Gibt es noch eine andere Möglichkeit, die Codes funktionieren zu lassen, ohne rhs als statische Funktion zu verändern? – drbombe

Antwort

1

Sie können die rhs machen() Funktion statisch in Ihrer Klasse, wenn es nicht der Klassenelementvariablen zuzugreifen ist, wie es in Ihrem Beispiel zu sein scheint.

Oder, wenn Sie rhs() als eine nicht-statische Methode der Klasse benötigen, können Sie std :: bind() verwenden (wenn Ihr Compiler C++ 11-konform ist) oder boost :: bind() um die Klassenmethode an die Klasseninstanz zu binden (zB "this").
Siehe Beispiele in this other StackOverflow answer.

Eine andere Option für C++ 11 Compiler ist die Verwendung lambda functions.

Wie auch immer, aus Ihrem Quellcode Snippet ist nicht wirklich klar, was Sie tun wollen, und ich schlage vor, Sie fügen Sie einen minimalen, aber vollständigen Quellcode, der Ihre Bedürfnisse zeigt, sowie besser definieren "funktioniert nicht" und "einige Fehler".

+0

Lambda-Funktion wird auch funktionieren – paweldac

+0

@paweldac: Recht, als eine andere Option hinzugefügt – roalz

+0

Ich bin neu in C++ und ich kann immer noch nicht eine Lösung. Hier ist ein minimalistischer Code, um zu veranschaulichen, was ich zu tun versuchte. Deine Hilfe wird hoch geschätzt! – drbombe

1

Sie können Lambda verwenden, so dass Sie Aufruf Klassenmethode in Abhängigkeit wickeln können:

void Animal::response() {  
    mystepper.do_step([&](const double x , double &dxdt , const double t) 
     { return rhs(x, dxdt, t); }); 
} 

Aber ein Blick auf Ihrer rhs Funktion kann es leicht eine statische Klasse-Funktion (es gibt keine Anrufe an den Mitglieder von seiner Tierklasse innen).

Verwandte Themen