实战经验:通过类成员函数指针实现类方法调用
成员指针解引用操作符(.*)从对象或引用获取成员
*成员指针箭头操作符(->*)通过对象的指针获取成员
类成员函数指针定义
因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下:
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
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
原文地址:https://www.cnblogs.com/zhoug2020/p/11394408.html
- SQL Server 2005 正则表达式使模式匹配和数据提取变得更容易
- [基础]datagridview绑定数据源的几种常见方式
- c#:winform鼠标拖动窗口大小时,设定窗口最小尺寸
- 在非SqlServer数据库上实现MemberShip和Role功能(自定义MemberShipProvider和RoleProvider)
- 一种实用的表格行鼠标点击高亮效果
- Lucene:QueryParser中操作符的疑惑
- 利用Boost影响Lucene查询结果的排序
- 利用Boost影响Lucene查询结果的排序
- linq to sql取出随机记录/多表查询/将查询出的结果生成xml
- [原创]Func〈T, TResult〉 泛型委托 以及演变历程(整理自MSDN)
- 上市企业4位数秒下的域名 如今9.9万元出售
- 黑客横行,全球安全系统集成市场将破百亿美元
- 有好东西融资2000万美金:官网启用四拼域名
- 全球首个农业全产业链智能工程“农业大脑”入选ECI
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【Java基础-3】数据结构之JSON浅析
- linux环境svn服务端及windows环境客户端安装配置
- 【Java集合-1】整体框架
- 【Java集合-2】HashMap简析
- 【Java集合-3】ArrayList简析
- Springboot之Security前后端分离登录
- Windows 10使用WSL作为python宿主机调试开发
- 小米正式开源 SQL 智能优化与改写工具 SOAR
- 【SpringBoot-1】面向小白编程:从0开始创建一个SpringBoot项目
- 【SpringBoot-3】Lombok使用详解
- 【JMeter系列-3】JMeter元件详解之配置元件
- 【JMeter-4】JMeter元件详解之逻辑控制器
- 【JMeter-4】JMeter关联:JMeter正则表达式提取器与JSON提取器
- 【JMeter系列-5】JMeter操作Mysql数据库
- 【JMeter系列-6】JMeter BeanShell Sampler与JMeter BeanShell断言