2010-03-19 4 views
4

Je souhaite passer une fonction membre de classe A à classe B via un pointeur de fonction en tant qu'argument. S'il vous plaît aviser si cette route mène quelque part et m'aider à remplir le nid-de-poule.Pointeur de fonction incompréhensible - passage en argument

#include <iostream> 


using namespace std; 

class A{ 
public: 

int dosomeA(int x){ 
    cout<< "doing some A to "<<x <<endl; 
    return(0); 
} 
}; 

class B{ 
public: 

B(int (*ptr)(int)){ptr(0);}; 
}; 

int main() 
{ 
A a; 
int (*APtr)(int)=&A::dosomeA; 

B b(APtr); 
return 0; 
} 

Ce brillant morceau de code me laisse avec l'erreur du compilateur:

cannot convert int (A::*)(int)' to int (*)(int)' in initialization

Tout d'abord je veux compiler.
Deuxièmement, je ne veux pas que dosomeA soit STATIQUE.

+0

Le concept que vous devez obtenir est que les fonctions membres non statiques requièrent une instance de la classe à appeler. Cela n'a tout simplement pas de sens autrement. – GManNickG

Répondre

6

Les pointeurs vers les membres sont différents des pointeurs de fonction normale. Comme l'erreur de compilation indique le type de &A::dosomeA est réellement int (A::*)(int) et non int (*)(int).

constructeur de l'intérieur B vous avez besoin d'une instance de A pour appeler le membre à l'aide d'un ou les .*->* opérateurs.

par exemple »

B(int(A::*ptr)(int)) 
{ 
    A atmp; 
    (atmp.*ptr)(int); 
} 
3

http://www.parashift.com/c++-faq-lite/pointers-to-members.html

Vous n'avez pas un pointeur vers une fonction qui retourne un int et prend un int. Vous avez un pointeur vers une fonction-membre qui retourne un int et prend un A * et un int. Non seulement vous devez corriger le type de votre pointeur, B doit fournir un A * pour servir de paramètre this de dosomeA.

Boost :: bind a une fonctionnalité destinée à simplifier l'utilisation des pointeurs de fonction en général, et fournit un support pour les pointeurs vers les fonctions membres. Voir here.

Questions connexes