2010-03-22 222 views
0

我需要一個基類的函數指針。以下是代碼:功能基類的指針

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); 
} 

函數內部的CCalibration發生錯誤。我嘗試像這樣調用函數指針:

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

問題是,我無法編譯。錯誤信息表示如下所示: 錯誤C2064:表達式不是函數,需要兩個參數。

出了什麼問題?

問候 camelord

回答

0

你需要一個對象上調用m_AddErrorMessage,是這樣的:

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

如果他使用'm_AddErrorMessage'不合格,那麼這可能是'CCalibration',它不是'CActionObjectBase'。編輯:你已經修復了' - > *'/' - >' – 2010-03-22 10:35:31

+0

@Charles你說得對,我將'this->'改爲'something->'。 – 2010-03-22 10:41:09

+0

我真的需要將CActionObjectBase的對象傳遞給CCalibration嗎?我試圖通過使用函數指針作爲參數來避免這種情況。然後我可以使用一個從CActionObjectBase派生的對象調用CCalibration函數,調用函數,就像我試圖在上面顯示的那樣: m_Calibration = new CCalibration(&CActionObjectBase :: AddResultStateErrorMessage); – camelord 2010-03-22 10:44:50

2

您需要提供在其上調用成員函數的對象:

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

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

與普通的對象和函數指針不同,指向成員的指針只能通過0來使用適當類型的對象來引用(用於對象和引用)或->*(用於指向對象的)運算符。