S e e D
Messages postés6Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention21 février 2008
-
19 févr. 2008 à 16:28
S e e D
Messages postés6Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention21 février 2008
-
21 févr. 2008 à 14:21
Bonjour,
J'ai un problème de syntaxe lors d'un appel d'un pointeur de fonction.
En gros j'ai le code suivant (qui est pas très joli mais j'ai pas beaucoup le choix) :
//fichier Cb.h----------------------------------------------
namespace A{class CA;};
namespace B
{class CB{
public:
CB();
~CB(){};
//A::CA *myCA;
int ((A::CA::*DoSomething)(int));
};
}
//fichier Cb.cpp----------------------------------------------
#include "Cb.h"
using namespace B;
CB::CB(){}
void CB::setcbDoSomething( int (A::CA::*func)(int)){
this->DoSomething = func;}
//fichier Ca.h----------------------------------------------
namespace A
{class CA{
public:
CA();
~CA(){};
B::CB *myCB;
int DoSomething(int toto);
};
}
/fichier Ca.cpp----------------------------------------------
#include "Ca.h"
using namespace A;
CA::CA(){
myCB = new B::CB();
myCB->DoSomething = &CA::DoSomething;}
int CA::DoSomething(int toto){
std::cout << "doing something in A" << std::endl;
return 1;}
Mon problème est sur cette ligne en rouge *(tmpCB->DoSomething)(5);
je ne sais pas comment l'écrire correctement pour que l'appel soit correcte.
j'ai essayé tmpCB->(*DoSometing)(5)
tmpCB->DoSomething(5)
*(tmpCB->DoSomething)(5)
et encore quelques autres mais sans résultat. j'ai soit une erreur C2064 : le terme ne correspond pas à une fonction qui prend 1 argument
ou une erreur C2059 erreur de syntaxe :'(' qui entraine tout plein d'erreur a la suite de cette ligne.
cs_juju12
Messages postés966Date d'inscriptionsamedi 3 avril 2004StatutMembreDernière intervention 4 mars 20104 19 févr. 2008 à 17:46
En fait ta fonction DoSomething est membre de classe donc de convention d'appel __thiscall (ie le compilateur lui passe implicitement comme premier argument un pointeur sur une instance de classe utilisée sous la forme this dans la fonction).
Donc pour utiliser le pointeur sur fonction il faut spécifier une instance, par exemple ceci compile :
(myCA->*(tmpCB->DoSomething))(5);
attention aux parenthèses, nécessaires à cause des priorités d'opérateurs.
S e e D
Messages postés6Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention21 février 2008 20 févr. 2008 à 09:44
Effectivement ca marche bien mieux. Merci pour ton aide Juju.
Seulement, je me rend compte que j'ai un peut trop simplifié mon exemple (bien que celui ci m'aidera). En fait j'appel mon pointer de fonction a l'interieur de CB dans un thread. Le code devient celui ci :
--Cb.h-------------------------------------
namespace A{class CA;};
namespace B
{class CB {
public:
CB();
~CB(){};
int ((A::CA::*DoSomething)(int));
static void DoSomethingToo(LPVOID lpParameter);
};
}
Mon 'local' est en fait un pointeur vers mon this que je ne peux pas appeler car je suis dans une fonction static. Donc en fait l'object de plus haut niveau est mon 'local' ?! Dans ce cas je n'arrive plus a appeller mon pointeur de fonction car je n'ai plus l'instance (myCA).
J'ai essayé de passer un pointeur de myCA dans myCB, mais comme je peux pas include mutuellement les headers des 2 class le pointeur de myCA que je passe a myCB ne peux etre utiliser correctement car myCB ne connais pas les fonction de la class myCA.
S e e D
Messages postés6Date d'inscriptionmercredi 2 février 2005StatutMembreDernière intervention21 février 2008 21 févr. 2008 à 10:01
oui voila c'est ce que j'ai essayé de faire. Je récupere bien le pointer, quand je veux faire des appels dessus intellisense me donne bien les membres de la classe CA mais quand je compile le compilo me retourne une erreur :
error C2027: utilisation du type non défini 'A::CA' alors que la classe CA est déclarée comme le premier bout de code que tu as fait avec le namespace en plus.
En faisant l'inverse je ne peux pas construire myCB dans CA car 'la classe n'a aucun constructeur'
J'ai l'impression que cette architecture est trop 'crade' pour permettre un dialogue correcte.
Merci encore Juju pour prendre un peut de temps pour regarder ca :)