Passer un pointeur à une fonction membre de la classe en tant que paramètre

J’ai écrit un petit programme dans lequel j’essaie de passer un pointeur à une fonction membre d’une classe à une autre fonction. Pouvez-vous s’il vous plaît m’aider et où je vais mal ..?

#include using namespace std; class test{ public: typedef void (*callback_func_ptr)(); callback_func_ptr cb_func; void get_pc(); void set_cb_ptr(void * ptr); void call_cb_func(); }; void test::get_pc(){ cout << "PC" << endl; } void test::set_cb_ptr( void *ptr){ cb_func = (test::callback_func_ptr)ptr; } void test::call_cb_func(){ cb_func(); } int main(){ test t1; t1.set_cb_ptr((void *)(&t1.get_pc)); return 0; } 

Je reçois le message d’erreur suivant lorsque je tente de le comstackr.

 error C2276: '&' : illegal operation on bound member function expression 

Vous ne pouvez pas convertir un pointeur de fonction en void* .

Si vous souhaitez qu’un pointeur de fonction pointe vers une fonction membre, vous devez déclarer le type comme

 ReturnType (ClassType::*)(ParameterTypes...) 

De plus, vous ne pouvez pas déclarer un pointeur de fonction sur une fonction membre liée, par exemple:

 func_ptr p = &t1.get_pc // Error 

Au lieu de cela, vous devez obtenir l’adresse comme ceci:

 func_ptr p = &test::get_pc // Ok, using class scope. 

Enfin, lorsque vous appelez un pointeur de fonction pointant sur une fonction membre, vous devez l’appeler avec une instance de la classe dont la fonction est membre. Par exemple:

 (this->*cb_func)(); // Call function via pointer to current instance. 

Voici l’exemple complet avec toutes les modifications appliquées:

 #include  class test { public: typedef void (test::*callback_func_ptr)(); callback_func_ptr cb_func; void get_pc(); void set_cb_ptr(callback_func_ptr ptr); void call_cb_func(); }; void test::get_pc() { std::cout << "PC" << std::endl; } void test::set_cb_ptr(callback_func_ptr ptr) { cb_func = ptr; } void test::call_cb_func() { (this->*cb_func)(); } int main() { test t1; t1.set_cb_ptr(&test::get_pc); t1.call_cb_func(); } 

En plus de la réponse de Snps, vous pouvez également utiliser un wrapper de fonctions de C ++ 11 pour stocker une fonction lambda:

 #include  #include  class test { public: std::function Func; void get_pc(); void call_cb_func(); void set_func(std::function func); }; void test::get_pc() { std::cout << "PC" << std::endl; } void test::call_cb_func() { Func(); } void test::set_func(std::function func) { Func = func; } int main() { test t1; t1.set_func([&](){ t1.get_pc(); }); t1.call_cb_func(); }