2017-04-01 39 views
0

我一直在努力使指向做這樣的事情(視覺C++)的方法的指針函數指針的靜態方法這樣的:指向沒有靜態方法

struct Dx 
{ 
    int SomeMethod() 
    { 
     return 4; 
    } 
}; 

struct Dy 
{ 
    static int(*pSomeMethod)();  
}; 

int(Dy::*pSomeMethod)() = (int(Dy::*)())&Dx::SomeMethod; 

到目前爲止好,這個編譯沒有問題,但如果我嘗試打電話給她:

Dy::pSomeMethod(); 

釷Ë編譯器返回我:

Error 1 error LNK2001: external symbol "public: static int (__stdcall * Dy::pSomeMethod) (void)" (? [email protected]@@2P6GHXZA) unresolved

我不明白,因爲它不是想pSomeMethod他是不是在SomeMethod指點?

+1

你不明白一個函數指針和一個類的方法指針之間的根本區別。他們是兩個完全不同的東西,你不能在兩者之間進行轉換。您也不能將一個類的類方法指針轉換爲另一個類的類方法指針。 –

回答

1

&test::tst的類型是int (test::*) (int),這是的成員函數指針

您正在試圖將其轉換爲定期指針類型,因爲它們是完全不同的,這是不可能。

這就是爲什麼你會有這樣類型轉換錯誤:

error C2440: 'type cast' : 
cannot convert from 'int (__thiscall test::*)(int)' to 'int (__cdecl *)(int)' 
1
int(Dy::*pSomeMethod)() = (int(Dy::*)())&Dx::SomeMethod; 

類型檢查,所以沒有從編譯器的抱怨。

至於:

Dy::pSomeMethod(); 

這是一個__cdecl。 但是,是的someMethod一個__thiscall,這意味着它真的很喜歡這個

int SomeMethod(Dx &this); 

所以,鏈接器無法找到匹配。

你根本就沒有一流的DX對象調用非靜態方法。

1

您的pSomeMethod聲明定義了一個指向類Dy中函數的指針,該函數返回int。你想,因爲它出現在鏈接錯誤來聲明它:

int (*Dy::pSomeMethod)(); 

這是Dy成員是一個指向返回一個int的功能。

你試圖做的事情將不起作用,因爲Dx::SomeMethodDx的成員函數,它需要一個this指針。調用pSomeMethod將不會有一個。

如果做得正確,你可以指定函數指針的地址不使用演員。