2010-03-22 6 views
0

J'ai besoin d'un pointeur de fonction d'une classe de base. Voici le code:Fonction Pointeur de la classe de base

class CActionObjectBase 
{ 
    ... 
    void AddResultStateErrorMessage(const char* pcMessage , ULONG iResultStateCode); 
    ... 
} 

CActionObjectCalibration(): CActionObjectBase() 
{ 
... 
m_Calibration = new CCalibration(&CActionObjectBase::AddResultStateErrorMessage); 
} 

class CCalibration 
{ 
... 
CCalibration(void (CActionObjectBase::* AddErrorMessage)(const char*, ULONG)); 
... 
void (CActionObjectBase::* m_AddErrorMessage)(const char*, ULONG); 
} 

L'interne CCalibration dans une fonction provoque l'erreur. J'essaie d'appeler le pointeur de fonction comme ceci:

if(m_AddErrorMessage) 
{ 
... 
m_AddErrorMessage("bla bla", RSC_FILE_ERROR); 
} 

Le problème est, que je ne peux pas compiler. Le message d'erreur indique quelque chose comme: erreur C2064: Expression n'est pas une fonction, qui prend deux arguments.

Qu'est-ce qui ne va pas?

concernant camelord

Répondre

0

Vous devez appeler m_AddErrorMessage sur un objet, quelque chose comme:

(something->*m_AddErrorMessage)(...) 
+0

S'il utilise 'm_AddErrorMessage' non qualifié, il s'agit probablement d'un' CCalibration' qui n'est pas un 'CActionObjectBase'. edit: vous avez corrigé '-> *'/'->' –

+0

@Charles Vous avez raison, j'ai changé 'this- >' en' quelque chose- >' à la place. –

+0

Ai-je vraiment besoin de passer un objet de CActionObjectBase à CCalibration? J'ai essayé d'éviter cela en utilisant un pointeur de fonction comme paramètre. Ensuite, je peux appeler la fonction CCalibration avec un objet, dérivé de CActionObjectBase, en appelant la fonction comme j'ai essayé de montrer ci-dessus: m_Calibration = new CCalibration (& CActionObjectBase :: AddResultStateErrorMessage); – camelord

2

Vous devez fournir un objet sur lequel vous appelez la fonction membre:

CActionObjectBase* pActionObjectBase /* = get pointer from somewhere */ ; 

(pActionObjectBase->*m_AddErrorMessage)("bla bla", RSC_FILE_ERROR); 

Contrairement aux pointeurs d'objet et de fonction normaux, les pointeurs vers des membres ne peuvent être déférés qu'à l'aide d'un objet de type approprié via le .* (pour les objets et les références) ou ->* (pour les pointeurs vers des objets) opérateurs.

Questions connexes