参考文章: 暴躁的野生猿<指向成员函数的函数指针>
适用于想通过一个指针数组下标的方式调用类中的一系列相关成员函数时
在类成员中定义函数指针或函数指针数组
- 建议通过
typedef
的方式提前定义好函数指针的类型,然后在定义数组,增加可读性 - 注意:指向成员函数的函数指针
变量
的定义pFunc
要将类名::*变量名
用()
括起来
typedef void(className::*pFunc)(int); // 控制轴旋转的函数指针类型
pFunc jointRotate[6]; // 控制轴旋转的函数指针数组
- 赋值的时候注意: 成员函数地址为
&类名::成员函数名
,与C语言风格相比,C++必须要加&
符号
pFunc jointRotate[6] = { &className::J1Rotate,
&className::J2Rotate,
&className::J3Rotate,
&className::J4Rotate,
&className::J5Rotate,
&className::J6Rotate,};
- 使用的时候注意指针数组作为一个类的成员必须通过
this->
obj.
pObg->
的方式调用
typedef void(className::*pFunc)(int);
this->jointRotate[0](90);
obj.jointRotate[0](90);
pObg->jointRotate[0](90);
- 附:单个函数指针的调用,使用成员
函数指针运算符
.*
该运算符不支持重载
typedef void(className::*pFuncType)(void);
className obj;
pFuncType pFunc = &className::J1Rotate;
int a = (obj.*p)();
C语言中的函数指针
- 函数地址:函数名或&函数名,两者均可。
- 函数指针变量的定义方法:把函数名替换为你喜欢的变量名,并在前面加
*
号,并把*
号和函数名
用()
起来。
char (*parseFrame)(char* frame, int len);
- 举例 : 两种方式,推荐第二种typedef的方式:
// 方式一:
char *(*pFunc)(char* frame, int len);
pFunc = parseFrame;
// 方式二:
typedef char *(*ParseFunc)(char* frame, int len);
ParseFunc pFunc;
pFunc = parseFrame;
pFunc = &parseFrame; // 都可以