//通过成员函数名获取成员函数的指针的时候,一定要注意加&;
//使用成员函数指针调用某个成员函数的时候,一定要指明该成员函数目前针对的操作对象,也就是类的实例,
//具体的方法就是(obj->*mem_ptr)();
#include <stdio.h>
#include <stdlib.h>
class FuncPointer{
public:
void TestFunc1(){
printf("call TestFunc1\n");
m_Fun = &FuncPointer::TestFunc2;
(this->*m_Fun)();
}
void TestFunc2(){
printf("call TestFunc2\n");
}
static void TestFunc3(){
printf("call TestFunc3\n");
}
public:
typedef void (*Fun)();
typedef void (FuncPointer::*MFun)();
MFun m_Fun;
};
class FuncPointer1{
public:
typedef void(FuncPointer::*MFun)();
MFun m_Fun;
};
typedef void(*G_Fun)();
void G_TestFun(){
printf("call G_TestFun\n");
}
int main(int argc, char *argv[]){
G_Fun fun1 = &FuncPointer::TestFunc3;
fun1();
//G_Fun fun2 = &FuncPointer::TestFunc1; //编译错误,不能将void (__thiscall FuncPointer::* )(void)指针转变为G_Fun
//FuncPointer::Fun fun3 = &FuncPointer::TestFunc1; 编译错误,不能将void (__thiscall FuncPointer::* )(void)指针转变为FuncPointer::Fun
FuncPointer::Fun fun4 = FuncPointer::TestFunc3;
fun4();
FuncPointer::Fun fun5 = G_TestFun;
fun5();
//FuncPointer::MFun fun6 = G_TestFun; 编译错误,不能将void (__cdecl *)(void)指针转变为FuncPointer::MFun
FuncPointer::MFun fun7 = &FuncPointer::TestFunc1;
//fun7(); //编译错误,对成员函数指针的调用要指明一个实例对象
FuncPointer *fp = new FuncPointer();
(fp->*fun7)();
fp->m_Fun = &FuncPointer::TestFunc2;
//(fp->*m_Func)(); //m_Func未声明
(fp->*(fp->m_Fun))();
FuncPointer1 *fp1 = new FuncPointer1();
fp1->m_Fun = &FuncPointer::TestFunc2;
(fp->*(fp1->m_Fun))();
system("pause");
return 0;
}
从上面的代码可以看出在使用成员函数指针的时候要注意一下的几个方面
不管是在类的内部还是在类的外部定义成员函数指针,格式必须为:
typedef RetType(ClassName::*MFun)(params...); //成员函数指针类型声明 MFun m_Fun; //成员函数指针定义
成员函数指针的取地址符&并不是所有的编译器都需要的,但是考虑到移植性最好要加上
可以对函数指针进行分类,如下图所示:
静态成员函数相当于普通函数,可以用普通函数指针指向。但是普通成员函数不能用普通函数指针指向。成员函数指针的调用一定要借用类实例。这个类实例用来初始化成员函数的this指针
注意成员函数指针的作用域,
(instance->*(instance_scope->m_func))()
。
其中instance用来初始化this指针,同时要求instance_scope中有个一成员变量m_func。
这个成员变量是一个成员函数指针,指向instance所属类中的某个非静态成员函数。