前言

阅读本文之前你需要明确知道函数指针和普通函数的区别,对这两者本文不做过多说明

目标

使用函数指针数组建立一套bpm工作流框架。这套框架在各种oa以及某几个大型通信公司应用的很广泛

适应场景

多分枝(类似Swtich)条件下、处理函数的形参列表和返回类型相同。如:

int func1(const char *pszContent);
int func2(const char *pszContent);
...
int funcN(const char *pszContent);void processMsg(int iMsgType, const char *pszContent)
{switch(iMsgType){case 1: func1(pszContent);break;case 2: func2(pszContent);break;...case N: funcN(pszContent);break;}

对于上述场景,我们可以采用函数指针数组的方式处理,如下:

typedef int (*pFunc)(const char*);    //创建函数指针
pFunc arrFuncPoint[n+1];              //创建函数指针数组//初始化指针数组
void init()
{arrFuncPoint[0] = 0;arrFuncPoint[1] = func1;    arrFuncPoint[2] = func2;...arrFuncPoint[N] = funcN;
}//调用函数
char szContent[""] = "HelloWorld";
arrFuncPoint[iIndex](szContent);

场景升级

有时候为了代码复用,比如计算器程序,我们把这些函数封装到一个类中,作为类的成员函数。现在场景就从普通函数升级为类的成员函数指针数组。如下:

class CFunction
{
public:CFuntion();~CFuntion();void testFunc(int iPos);protected:void func1(int iNum) {printf("%d\n", iNum);}void func2(int iNum) {printf("%d\n", 2*iNum);}private://特别注意定义成类的作用域,后面讲原因//typedef void (CFunction::*pFunc)(int);//pFunc m_arrFunc[2];//效果等同上述两条语句void (CFunction::*pFunc[2])(int);
}CFunction::CFunction()
{pFunc[0] = &CFunction::func1;pFunc[1] = &CFunction::func2;
}void CFunction::testFunc(int iPos, int iNum)
{(this->*pFunc[iPos])(iNum);
}

那为什么定义函数指针数组时要明确指出类的作用域呢?

因为对于非static的成员函数,函数的真正原型并不是你所看到的那样。比如上面声明了void func1(int iNum),其实真正的原型是形参列表前面有个this指针,也就是void func1(this, int iNum);所以在创建函数指针时要按结构来。但是对于普通的函数和static函数并不用给出作用类,因为函数形参中并没有this指针,故能省略掉类作用域。

C++类成员函数指针数组应用(二)

参考链接:https://segmentfault.com/q/1010000004233580

C++ 类成员函数指针数组应用(一)相关推荐

  1. 详解函数指针和类成员函数指针

    作者:倾夜·陨灭星尘 一.什么是函数指针? 函数指针,顾名思义即指向函数的指针. 如果要问,为什么能用一个指针指向一个函数呢?我觉得要理解这个问题,以及要理解后面的函数指针和类成员函数指针,没有什么比 ...

  2. C++ 函数指针 类成员函数指针

    一.函数指针 函数存放在内存的代码区域内,它们同样有地址.如果我们有一个int test(int a)的函数,那么,它的地址就是函数的名字,这一点如同数组一样,数组的名字就是数组的起始地址. 1.函数 ...

  3. 类成员函数指针的语法

    /*类成员函数指针的语法*/ /*****************************类.h文件************************************/ #if !defined ...

  4. C++函数指针和类成员函数指针

    一.函数指针--基本形式 char Fun(int n) { return char(n); } //char(*pFun)(int);void main() {char(*pFun)(int);pF ...

  5. 类成员函数指针和普通函数指针

    前言: 先声明一下,普通函数指针和类成员函数指针有很大的区别!所以在绑定函数的时候也会发生很多的不同的情况,本文就函数指针可能出现的各种情况一一进行分析. 测试目录: 1.普通函数指针指向普通函数 2 ...

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

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

  7. C++普通函数指针和类成员函数指针

    举例1:普通函数指针: int(*fun)(double, int);fun = [](double a, int b) {cout << a << endl;cout < ...

  8. c++中的类成员函数指针

    c++中的类成员函数指针 文章目录 c++中的类成员函数指针 发生的事情 正常的函数指针定义 定义类的成员函数指针 std::function 发生的事情 最近,想用一个QMap来创建字符串和一个函数 ...

  9. C++类成员函数指针使用介绍

    前言 在之前写过的博客中有介绍过函数指针和指针函数的区别和简单用法(文章在这里),当时的Demo非常简单,都是C语言的写法,但是当在C++中直接像C那样使用类成员函数指针时就会报错:reference ...

最新文章

  1. python 搜索pdf文件中的文字_使用python查找搜索字符串在pdf文档中位于哪一页上...
  2. java dump分析工具_java性能分析与常用工具
  3. python快速编程入门课后题答案-python语言程序设计基础(嵩天)第四章课后习题部分答案...
  4. ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记
  5. 交际过程的两个基本环节_跨文化交际学概论笔记(二)
  6. 另一个SqlParameterCollection 中已包含 SqlParameter[解决方案]
  7. java条件运算符类型转换_Java数据类型、运算符及类型转换
  8. 2022电工杯数学建模A题目思路总结分享
  9. js 根据链接下载 excel 文件
  10. 大数据可视化之MyBatis笔记(1)
  11. RSTP快速生成树简介、RSTP与STP的区别、RSTP BPDU字段信息、RSTP角色与端口状态介绍、RSTP工作过程之P/A机制详细分解)
  12. 如何使投资收益最大化?
  13. pageoffice在线打开word文件加盖电子印章
  14. 上海育才高中2021高考成绩查询,育才中学2018高考成绩
  15. mysql服务重启和关闭
  16. 对加噪音前后的音频信号进行频谱分析
  17. 泛微OA二次开发基础培训文档
  18. 分享:SET“红绳”悬吊运动训练的基本概念
  19. (PAT)卡拉兹(Callatz)猜想/3n+1猜想
  20. 【夏虫语冰】Visual Studio工程编译问题汇总

热门文章

  1. 在linux下怎么下载虎牙m3u8视频
  2. 【机器学习】回归树生成过程及举例理解
  3. 读《韭菜的自我修养》,李笑来都讲了什么?
  4. java解析rar压缩包兼容rar4
  5. linux命令大全 保存退出,怎么保存退出命令linux vi
  6. windows exploer 电脑不停刷新闪屏
  7. fork函数详解(转载)
  8. 电子数据取证第二章读书笔记
  9. iOS svn 冲突解决
  10. vue项目头部路由,侧边栏路由联动问题