问题

在开发中,有时候可能需要使用到类成员指针来调用类的方法。例如,可能会有一个函数调用表格,根据不同的情况调用表格中不同的类成员函数。今天使用一个简单的例子来讲述如何使用类成员函数指针。

类成员函数指针定义

因为函数是一个类的成员,所以它的指针定义有别于全局函数,格式如下:

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.)。

外部方法调用内部_实战经验:通过类成员函数指针实现类方法调用相关推荐

  1. C++ 类成员函数指针的使用方法

    C++ 类成员函数指针的使用方法 #include <iostream>void func(){ std::cout << "void func()" &l ...

  2. C++成员函数指针的另类调用方法

    直接上代码,其实挺简单的. #include "stdio.h"  class baseClass {             public:              void ...

  3. python类的成员函数_注入一个python类成员函数

    你在这里要做的是Child2.foo用self不是a的方法调用未绑定的方法Child2. 这是非法的,Python 2将检测到并提出一个TypeError解释错误的地方:TypeError: unbo ...

  4. C++中空指针调用类成员函数的原理

    有下面的一个简单的类: class CNullPointCall { public:     static void Test1();     void Test2();     void Test3 ...

  5. 介绍了如何取成员函数的地址以及调用该地址

     摘要:介绍了如何取成员函数的地址以及调用该地址. 关键字:C++成员函数 this指针 调用约定 一.成员函数指针的用法 在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以 ...

  6. 关于使用类成员函数作为回调的方法

    为什么类成员函数不能直接做为回调函数? 因为windows中,回调函数都是显式使用CALLBACk修饰符修饰,也就是_stdcall参数传递方式._stdcall修饰的函数,参数从右至左依次压入堆栈, ...

  7. c语言callback函数用法,C函数回调(callback)C++类成员函数的方法

    问题的由来 C回调的步骤一般是: 声明callback函数类型: 根据类型定义一个callback函数A: 把定义的函数A,作为参数传入到另外一个函数B: 函数B会在某个时刻,调用A. 因为C里面函数 ...

  8. C++函数指针定义及调用

    今天在一问一答审核题目的时候发现一个题目的题干是错的,主要意思就是定义一个函数指针,现在将修改后的结果放上来,给出定义函数指针的方法: /** 作者: 齐士垚 日期: 2013.5.8 功能: 定义函 ...

  9. c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊?

    c++中非静态函数不能用类名调用,为什么CWnd的成员函数GetDC()可以直接调用啊? CDC::Lineto提示 非静态成员引用必须与特定对象相对 还有,为什么CWnd的许多函数都可以直接调用? ...

  10. c ++类成员函数_仅使用C ++创建具有公共数据成员的类

    c ++类成员函数 Let's understand 让我们来了解 What is data member? 什么是数据成员? Any variable declared inside the cla ...

最新文章

  1. mysql5.7+ 虚拟列,json使用初体验
  2. ILRuntime_NewbieGuide—入门
  3. Qt工作笔记-QMainWindow自定义窗体中利用状态栏进行窗体放缩
  4. uva 11419 最大匹配(最小点覆盖)
  5. 06-人脸识别-MTCNN的感性认识(转载)
  6. red linux 9 中文,Red Hat Linux 9 命令行中文显示问题
  7. php xml 怎么去掉头,PHP如何删除xml某条数据
  8. 拓端tecdat|windows中用命令行执行R语言命令
  9. Atitit 转移特效attilax总结
  10. postman post传输中文_Postman:Postman简介、安装、入门使用方法详细攻略
  11. python 实例化对象_python如何实例化对象
  12. 应用工具推荐phpStudy(小皮面板)
  13. 休闲娱乐 - 如何打坐
  14. C# 调用微信接口上传素材和发送图文消息
  15. 天气学诊断实习四 计算垂直速度
  16. 如何将文字翻译成英文?简单教程讲解
  17. 在线教育行业未来的发展趋势
  18. 【蓝桥杯单片机进阶强化-06】超声波测距的基本原理与实现
  19. mysql中表联结_MySQL -- 表联结
  20. python place布局_Python TKinter布局管理Place()Grid Pack详解

热门文章

  1. 阿里云解决方案架构师李晨:百万级价签系统的实时洞察与创新实践
  2. 阿里巴巴的AI“发动机”
  3. Kafka从上手到实践 - Kafka集群:Kafka Listeners | 凌云时刻
  4. 【路径规划】基于matlab遗传和模拟退火算法机器人路径规划【含Matlab源码 1206期】
  5. 【细胞分割】基于matlab GUI生物细胞计数【含Matlab源码 758期】
  6. 【人脸识别】基于matlab GUI Haar分类器五官定位【含Matlab源码 686期】
  7. pytorch深度学习入门_立即学习AI:01 — Pytorch入门
  8. java树广度优先_如何在功能上生成树广度优先 . (使用Haskell)
  9. python pyz_python-3.x – 如何在Alpine Linux容器上安装pyz...
  10. vue中 点击事件的写法_Vue父子组件状态同步的最佳方式