实战经验:通过类成员函数指针实现类方法调用
成员指针解引用操作符(.*)从对象或引用获取成员
*成员指针箭头操作符(->*)通过对象的指针获取成员
类成员函数指针定义
因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下:
typedef 返回值(类名::*函数指针类型名称)(参数列表);
需要注意的地方
1) 使用typedef创建一个用户自定义类型,这个类型的名称即上述格式中的函数指针类型名称
2) 在函数指针类型名称之前需要添加类名,并加上双引号(::)
初始化方式
假设我们的一个类有如下的成员函数:
bool DriveCar(LPCTSTR pszCar);
则对应的,我们定义了如下的类成员函数指针来描述此成员函数
typedef bool (CPerson::*FP_DriveCar)(LPCTSTR pszCar);
注意这里的类标记(CPerson::),以及类成员指针前的星号(*)。
那么我们可以为该类定义函数指针类型的数据成员
FP_DriveCar m_pfnDriveCar;
这里的m_pfnDriveCar是一个数据成员,其类型为指向类成员的函数指针(FP_DriveCar)。
则该数据成员初始化方法如下:
m_pfnDriveCar = &CPerson::DriveCar;
使用类名作为前缀,指明我们需要访问CPerson类的DriveCar方法。另外,加上取地址符号(&)取得其函数地址。
调用方式
1) 在类内部
(this->*m_pfnDriveCar)(_T(“TestCar”));
2) 在类外部
CPerson person;
FP_DriveCar g_pfnDriveCar = &CPerson::DriveCar;
(person.*g_pfnDriveCar)(_T(“TestCar”));
注意的地方
1) 在类内部调用时,需要加上(this->)。
2) 在类外部调用时,需要加上对象的实例,这里即(person.)。
3) 函数指针前加上解除引号符号(*)。
以下为完整的示例代码



总结
1) 类成员函数指针和普通全局函数指针的区别在于,需要特殊的语法(通常是加上类名)来进行定义和调用,这是因为类成员函数有一个隐藏的this参数。
2) 如果需要在类外部使用类函数指针,则目标类成员函数必须设定为public访问类型。
3) 调用时,需要显式的加上类实例(以上代码中的this->或者person.)。
作者:漫漫开发路
链接:https://www.jianshu.com/p/036f0c789db2
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
2017-08-22 listview加载数据
2016-08-22 在平面中,一个点绕任意点旋转θ度后的点的坐标
2016-08-22 一条直线围绕着不是原点的点旋转后的坐标怎么算
2016-08-22 在平面内,已知一个矩形的四个角坐标,将矩形绕中心点转动一个角度,求旋转后的角坐标.
2016-08-22 园与直线相交