在实际工作中需要用到类成员函数指针,结果发现不是那么好用,于是上网查找了一下资料,终于通过了编译。
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;
}
//如果还有问题,可以与我联系!