外部方法调用内部_实战经验:通过类成员函数指针实现类方法调用
问题
在开发中,有时候可能需要使用到类成员指针来调用类的方法。例如,可能会有一个函数调用表格,根据不同的情况调用表格中不同的类成员函数。今天使用一个简单的例子来讲述如何使用类成员函数指针。
类成员函数指针定义
因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下:
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.)。
外部方法调用内部_实战经验:通过类成员函数指针实现类方法调用相关推荐
- C++ 类成员函数指针的使用方法
C++ 类成员函数指针的使用方法 #include <iostream>void func(){ std::cout << "void func()" &l ...
- C++成员函数指针的另类调用方法
直接上代码,其实挺简单的. #include "stdio.h" class baseClass { public: void ...
- python类的成员函数_注入一个python类成员函数
你在这里要做的是Child2.foo用self不是a的方法调用未绑定的方法Child2. 这是非法的,Python 2将检测到并提出一个TypeError解释错误的地方:TypeError: unbo ...
- C++中空指针调用类成员函数的原理
有下面的一个简单的类: class CNullPointCall { public: static void Test1(); void Test2(); void Test3 ...
- 介绍了如何取成员函数的地址以及调用该地址
摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以 ...
- 关于使用类成员函数作为回调的方法
为什么类成员函数不能直接做为回调函数? 因为windows中,回调函数都是显式使用CALLBACk修饰符修饰,也就是_stdcall参数传递方式._stdcall修饰的函数,参数从右至左依次压入堆栈, ...
- c语言callback函数用法,C函数回调(callback)C++类成员函数的方法
问题的由来 C回调的步骤一般是: 声明callback函数类型: 根据类型定义一个callback函数A: 把定义的函数A,作为参数传入到另外一个函数B: 函数B会在某个时刻,调用A. 因为C里面函数 ...
- C++函数指针定义及调用
今天在一问一答审核题目的时候发现一个题目的题干是错的,主要意思就是定义一个函数指针,现在将修改后的结果放上来,给出定义函数指针的方法: /** 作者: 齐士垚 日期: 2013.5.8 功能: 定义函 ...
- c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?
c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊? CDC::Lineto提示 非静态成员引用必须与特定对象相对 还有,为什么CWnd的许多函数都可以直接调用? ...
- c ++类成员函数_仅使用C ++创建具有公共数据成员的类
c ++类成员函数 Let's understand 让我们来了解 What is data member? 什么是数据成员? Any variable declared inside the cla ...
最新文章
- mysql5.7+ 虚拟列,json使用初体验
- ILRuntime_NewbieGuide—入门
- Qt工作笔记-QMainWindow自定义窗体中利用状态栏进行窗体放缩
- uva 11419 最大匹配(最小点覆盖)
- 06-人脸识别-MTCNN的感性认识(转载)
- red linux 9 中文,Red Hat Linux 9 命令行中文显示问题
- php xml 怎么去掉头,PHP如何删除xml某条数据
- 拓端tecdat|windows中用命令行执行R语言命令
- Atitit 转移特效attilax总结
- postman post传输中文_Postman:Postman简介、安装、入门使用方法详细攻略
- python 实例化对象_python如何实例化对象
- 应用工具推荐phpStudy(小皮面板)
- 休闲娱乐 - 如何打坐
- C# 调用微信接口上传素材和发送图文消息
- 天气学诊断实习四 计算垂直速度
- 如何将文字翻译成英文?简单教程讲解
- 在线教育行业未来的发展趋势
- 【蓝桥杯单片机进阶强化-06】超声波测距的基本原理与实现
- mysql中表联结_MySQL -- 表联结
- python place布局_Python TKinter布局管理Place()Grid Pack详解
热门文章
- 阿里云解决方案架构师李晨:百万级价签系统的实时洞察与创新实践
- 阿里巴巴的AI“发动机”
- Kafka从上手到实践 - Kafka集群:Kafka Listeners | 凌云时刻
- 【路径规划】基于matlab遗传和模拟退火算法机器人路径规划【含Matlab源码 1206期】
- 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
- 【人脸识别】基于matlab GUI Haar分类器五官定位【含Matlab源码 686期】
- pytorch深度学习入门_立即学习AI:01 — Pytorch入门
- java树广度优先_如何在功能上生成树广度优先 . (使用Haskell)
- python pyz_python-3.x – 如何在Alpine Linux容器上安装pyz...
- vue中 点击事件的写法_Vue父子组件状态同步的最佳方式