在實際工作中需要用到類成員函數指針,結果發現不是那麼好用,於是上網查找了一下資料,終於通過了編譯。
class TEncFile{
public:
void Fun(char* b){printf("%s\n",b);}
};
//假設我們要通過函數指針調用類TEncFile內部的Fun函數,那麼需要定義一個函數指針,格式如下:其中TEncFile::標誌着此指針是指向類內部的成員函數。
typedef void (TEncFile::*FUN)(char*);
//使用的時候比較簡單,如下:
FUN fun = TEncFile::Fun;
//因爲成員函數的地址是固定的,不需要實例化即可。注意調用的時候,必須要有一個TEncFile的類實例或者對象
TEncFile A;
(A.*fun)("123456");
TEncFile* B = new TEncFile();
(B->*fun)("ABCDEF");
//甚至定義空指針也能夠運行,如果在你運行的函數內部沒有TEncFile的實例,而實例化的代價太大的話,可以這樣:
TEncFile* p = NULL;
(p->*fun)("hello");
這裏注意,由於.*和->*的優先級比較低,所喲必須用括號把成員函數指針括起來。 下面有詳細的實例,使用C++ Builder2009編譯通過
//--------------------------------------------------------------------------
//test.cpp
//--------------------------------------------------------------------------
#pragma hdrstop
#include <tchar.h>
#include <conio.h>
#include <stdio.h>
//---------------------------------------------------------------------------
#pragma argsusedclass TEncFile; //預先聲明,否則下面一行因爲找不到TEncFile的定義而報錯。
//
typedef void (TEncFile::*FUN)(char*); //聲明類成員函數指針
class TEncFile{
public:
void Fun(char* b){printf("%s\n",b);}
};
int _tmain(int argc, _TCHAR* argv[])
{
FUN fun = TEncFile::Fun; //獲取指針
//
TEncFile A;
(A.*fun)("123456"); //演示 .* 的用法
//
TEncFile* B = new TEncFile();
(B->*fun)("ABCDEF"); //演示 ->* 的用法
//
TEncFile* p = NULL;
(p->*fun)("NULL Point!"); //空指針也能工作,注意這裏不要和 p->Fun("NULL,Point!") 混淆,後者會出錯!
//
//注意 .* 和 ->* 的運算級別很低,所以必須用括號,否則編譯報錯。
getch();
return 0;
}
//如果還有問題,可以與我聯繫!