實戰經驗:通過類成員函數指針實現類方法調用


成員指針解引用操作符(.*)從對象或引用獲取成員
*成員指針箭頭操作符(->*)通過對象的指針獲取成員

 

 

類成員函數指針定義

因為函數是一個類的成員,所以它的指針定義有別於全局函數,格式如下:

typedef 返回值(類名::*函數指針類型名稱)(參數列表);

需要注意的地方

1) 使用typedef創建一個用戶自定義類型,這個類型的名稱即上述格式中的函數指針類型名稱

2) 在函數指針類型名稱之前需要添加類名,並加上雙引號(::)

初始化方式

假設我們的一個類有如下的成員函數:

bool DriveCar(LPCTSTR pszCar);

則對應的,我們定義了如下的類成員函數指針來描述此成員函數

typedef bool (CPerson::*FP_DriveCar)(LPCTSTR pszCar);

注意這里的類標記(CPerson::),以及類成員指針前的星號(*)。

那么我們可以為該類定義函數指針類型的數據成員

FP_DriveCar m_pfnDriveCar;

這里的m_pfnDriveCar是一個數據成員,其類型為指向類成員的函數指針(FP_DriveCar)。

則該數據成員初始化方法如下:

m_pfnDriveCar = &CPerson::DriveCar;

使用類名作為前綴,指明我們需要訪問CPerson類的DriveCar方法。另外,加上取地址符號(&)取得其函數地址。

調用方式

1) 在類內部

(this->*m_pfnDriveCar)(_T(“TestCar”));

2) 在類外部

CPerson person;

FP_DriveCar g_pfnDriveCar = &CPerson::DriveCar;

(person.*g_pfnDriveCar)(_T(“TestCar”));

注意的地方

1) 在類內部調用時,需要加上(this->)。

2) 在類外部調用時,需要加上對象的實例,這里即(person.)。

3) 函數指針前加上解除引號符號(*)。

以下為完整的示例代碼

 

總結

1) 類成員函數指針和普通全局函數指針的區別在於,需要特殊的語法(通常是加上類名)來進行定義和調用,這是因為類成員函數有一個隱藏的this參數。

2) 如果需要在類外部使用類函數指針,則目標類成員函數必須設定為public訪問類型。

3) 調用時,需要顯式的加上類實例(以上代碼中的this->或者person.)。



作者:漫漫開發路
鏈接:https://www.jianshu.com/p/036f0c789db2
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM