Funzione puntatore alla funzione membro

Mi piacerebbe impostare un puntatore a funzione come membro di una class che è un puntatore a un’altra funzione nella stessa class. I motivi per cui lo sto facendo sono complicati.

In questo esempio, vorrei che l’output fosse “1”

class A { public: int f(); int (*x)(); } int A::f() { return 1; } int main() { A a; ax = af; printf("%d\n",ax()) } 

Ma questo non riesce alla compilazione. Perché?

La syntax è sbagliata. Un puntatore membro è una categoria di tipi diversa da un puntatore ordinario. Il puntatore membro dovrà essere usato insieme a un object della sua class:

 class A { public: int f(); int (A::*x)(); // <- declare by saying what class it is a pointer to }; int A::f() { return 1; } int main() { A a; ax = &A::f; // use the :: syntax printf("%d\n",(a.*(ax))()); // use together with an object of its class } 

ax non dice ancora su quale object deve essere richiamata la funzione. Dice solo che vuoi usare il puntatore memorizzato nell'object a . Se si preme un'altra volta, l'operando di sinistra verso l'operatore .* Dirà al compilatore su quale object chiamare la funzione.

int (*x)() non è un puntatore alla funzione membro. Un puntatore alla funzione membro è scritto in questo modo: int (A::*x)(void) = &A::f; .

Chiamare la funzione membro sul comando stringa

 #include  #include  class A { public: void call(); private: void printH(); void command(std::string a, std::string b, void (A::*func)()); }; void A::printH() { std::cout<< "H\n"; } void A::call() { command("a","a", &A::printH); } void A::command(std::string a, std::string b, void (A::*func)()) { if(a == b) { (this->*func)(); } } int main() { A a; a.call(); return 0; } 

Fai attenzione a (this->*func)(); e il modo per dichiarare il puntatore a funzione con nome class void (A::*func)()

È necessario utilizzare un puntatore a una funzione membro, non solo un puntatore a una funzione.

 class A { int f() { return 1; } public: int (A::*x)(); A() : x(&A::f) {} }; int main() { A a; std::cout << (a.*ax)(); return 0; } 

Mentre questo è basato sulle risposte in sterline altrove in questa pagina, ho avuto un caso d’uso che non è stato completamente risolto da loro; per un vettore di puntatori alle funzioni procedi come segue:

 #include  #include  #include  #include  class A{ public: typedef vector (A::*AFunc)(int I1,int I2); vector FuncList; inline int Subtract(int I1,int I2){return I1-I2;}; inline int Add(int I1,int I2){return I1+I2;}; ... void Populate(); void ExecuteAll(); }; void A::Populate(){ FuncList.push_back(&A::Subtract); FuncList.push_back(&A::Add); ... } void A::ExecuteAll(){ int In1=1,In2=2,Out=0; for(size_t FuncId=0;FuncId*FuncList[FuncId])(In1,In2); printf("Function %ld output %d\n",FuncId,Out); } } int main(){ A Demo; Demo.Populate(); Demo.ExecuteAll(); return 0; } 

Qualcosa di simile è utile se stai scrivendo un interprete di comandi con funzioni indicizzate che devono essere sposate con syntax dei parametri e suggerimenti di aiuto, ecc. Forse anche utili nei menu.