2

讓我通過一個示例(使用VS2013的VC++代碼)來解釋我的問題。通過VC++中的類A函數指針調用類成員函數(類B)

void Imhere(int num) 
{ 
    printf_s("\n Hello World printed %d\n",num); 
} 
class Abc; 
class Dllclas 
{ 
    public: 
    void dllFunc() 
    { 
     printf_s("\n Heelo this is DLl func\n"); 
    } 
}; 

void outsideFunc() 
{ 
    printf_s("\n Heelo this is outside func\n"); 
} 
typedef void(*outsideFP)(); 
typedef void (Dllclas::*funcFP)(); 
class Abc 
{ 
public: 
    funcFP fp; 
    outsideFP outFp; 
    int a; 
    void assignOUTFp() 
    { 
     outFp = &outsideFunc; 
    } 
    void assignFP() 
    { 
     fp = &(Dllclas::dllFunc); 
    } 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    Abc* abcObj1 = new Abc(); 
    abcObj1->a = 7; 

    abcObj1->assignOUTFp(); 
    abcObj1->outFp(); // THIS FUNCTION CALL WORKS PERFECTLY FINE. 

    abcObj1->assignFP(); 
    abcObj1->fp(); // COMPILATION ERROR. 

在該代碼段,在最後一行

abcObj1-> FP(); //編譯錯誤。

我收到編譯錯誤。

錯誤C2064:術語不計算爲服用0參數

另外,如果我懸停我的鼠標在「abcObj1-> FP()」,我得到一個紅色的錯誤讀取功能「前述顯而易見呼叫的括號

表達式必須具有 (指針TO-)功能類型

在這裏,我'能夠調用函數「abcObj1-> outFp();這是在任何階級之外。 因此,我知道我得到這個錯誤的原因是因爲,函數地址出現在「abcObj1-> fp();」屬於Dllclas類中的一個成員函數,即「dllFunc()。

我也refered的鏈接 link但我無法解析編譯錯誤。

我能請得到與代碼示例幫助? 預先感謝

+0

我找不到'FP'成員。你的意思是'fp'? – dasblinkenlight

+0

是的,這是「fp」而不是「FP」(錯字),我很抱歉。現在糾正它。謝謝。 – codeLover

+0

'fp'是'Dllclas'成員的指針。你需要一個'Dllclas'的實例來調用這個成員 - 就​​像你不能直接調用'dllFunc'而沒有'Dllclas'實例一樣。 –

回答

1

第一誤差可通過去除括號被固定:

fp = &Dllclas::dllFunc; // This will compile 

第二個問題是難以解決:回顧,以便調用一個構件功能,您需要兩兩件事:

  • 的指針功能,
  • 在其上調用該函數的對象。

因此,你需要Dllclas類型的「目標」對象,以及:

Dllclas target; 
(target.*abcObj1->fp)(); 

的語法是有點瘋狂這裏 - .*通過abcObj1->fp獲得的函數指針適用於調用的目標,即類型爲Dllclas的對象。如果你有一個指向目標,而不是目標本身,使用->*操作:

Dllclas *targetPtr; 
(targetPtr->*abcObj1->fp)(); 
+0

完美的工作表示感謝。 – codeLover

1

調用一個成員函數指針f如果x的語法是一個指針是

(x->*f)(); 

由於名稱你的成員指針(在_tmain)是abcObj->fp,你需要使用

(abcObj->*(abcObj->fp))(); 

可以簡化通過添加另一個成員到Abc,就像

void callFP() 
{ 
    (*fp)(); 
} 
相關問題