Ich werde meine Frage mit dem folgenden Beispielcode beschreiben.Vermeiden Sie den Klassenbereich, um eine Elementfunktion als Funktionszeiger zu übergeben
Ich habe Klasse B wie folgt definiert:
class B
{
public:
inline B(){}
inline B(int(*f)(int)) :myfunc{ f }{}
void setfunction(int (*f)(int x)) { myfunc = f; }
void print(int number) { std::cout << myfunc(number) << std::endl; }
private:
int(*myfunc)(int);
};
ich dann Klasse A wie folgt definieren:
class A
{
public:
A(int myint) :a{ myint }{ b.setfunction(g); }
int g(int) { return a; }
void print() { b.print(a); }
private:
B b;
int a;
};
Für mich ist das Problem scheint zu sein, dass die Elementfunktion g die Signatur int A::g(int)
anstatt int g(int)
.
Gibt es eine Standardmethode, um die oben genannten Arbeiten auszuführen? Ich denke, das ist eine ziemlich allgemeine Konfiguration, da wir eine Klasse (Klasse B) haben, die eine Art von Memberfunktionen enthält, die einige Operationen ausführen, und wir haben eine Klasse (Klasse A), die eine bestimmte Memberfunktion der Klasse verwenden muss B - so ist mein Entwurf falsch, und wenn ja, was ist der beste Weg, diese Idee auszudrücken?
Ja, erklären diese Funktion 'static'. Verwenden Sie alternativ eine Interface-Klasse, in der Sie eine abstrakte Funktion definieren: virtual int g (int) = 0; Leiten Sie die Klasse 'A' von dieser Klasse ab:' Klasse A: public '. Übergeben Sie dann eine Instanz dieser Klasse an diese Funktionen in der Klasse "B". –
Da Sie C++ 11/14 getaggt haben, könnte ich vorschlagen, eine 'std :: function' mit einem Lambda zu verwenden? Es wird dich ein bisschen kosten, aber es gibt keinen besseren Weg. – user975989
Google "Mitglied Funktionszeiger C++" –