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

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

 

 

類成員函數指針定義this

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

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

須要注意的地方orm

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

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

初始化方式開發

假設咱們的一個類有以下的成員函數:io

bool DriveCar(LPCTSTR pszCar);form

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

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 來源:簡書 簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。
相關文章
相關標籤/搜索