摘要:本文講述類成員指針的內部機制以及它的一般使用方法......
最近我收到許多有關類方法指針的問題,比如:在 VC 中無法使用類方法指針,編譯器報 如下錯誤:
Cannot convert parameter 2 from ''long (unsigned long)''to''long (__cdecl *)(unsigned long)''
我該怎麼辦?
下面是解決這個問題的代碼:
//in the header
class CKernel:
{
long (*lpFunc)(DWORD);
long OLESendTC( DWORD dwInfo );
}
//in the cpp File
BOOL CKernel::Init()
{
lpFunc = OLESendTC;
return TRUE;
}
大家知道,類成員都有一個隱含的參數,即類對象本身的一個指針,其方法都是這個對象 上調用的。C++ 使用該指針查找任何方法擬引用的類數據的位置。如果你想嘗試用標准函數 指針來調用某個類的方法,C++ 便無法傳遞此隱含的參數,並且要引發沖突。
為了解決這個問題並改進類型安全機制,C++ 添加了三個新操作符,::*、.* 和->, 以便引入安全的成員指針。這些成員指針既可以指向成員函數,也可以指向變量。
class CTest
{
public:
BOOL Init();
long OLESendTC(DWORD dwInfo);
};
long (CTest::*lpFunc)(DWORD dwInfo) = &CTest::OLESendTC;
int main()
{
CTest test;
(test.*lpFunc)(0);
return 0;
}
long CTest::OLESendTC(DWORD dwInfo)
{
cout << "IN OLESENDTC\n";
return 0;
}
這個例子示范了成員指針的使用。代碼用::*操作符將 lpFunc 聲明為一個 CTest 成員函 數的指針。注意,這裡並不是在運行時賦值給這個指針,該指針在聲明中被初始化。在 main 函數中,此例子用 .* 操作符來調用由 lpFunc 指向的方法。如果這裡 test 是一個指針, 你將用 ->* 操作符代替。
C++ 有許多像隱藏方法參數這樣的內部機制。成員指針使你能安全地聲明類方法指針並通 過該指針來調用方法。