程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> 關於VC++ >> 指向類成員

指向類成員

編輯:關於VC++

摘要:本文講述類成員指針的內部機制以及它的一般使用方法......

最近我收到許多有關類方法指針的問題,比如:在 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++ 有許多像隱藏方法參數這樣的內部機制。成員指針使你能安全地聲明類方法指針並通 過該指針來調用方法。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved