類成員函數指針的用法

 
  在實際工作中需要用到類成員函數指針,結果發現不是那麼好用,於是上網查找了一下資料,終於通過了編譯。
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;
}  
  //如果還有問題,可以與我聯繫!
 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章