当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员。实例代码如下:

//.h #define SCMD_REGISTER 0 class CCallFuctionList { public: CCallFuctionList(); virtual ~CCallFuctionList(void); typedef void (* FUNCPTR)(); typedef std::multimap<unsigned int, FUNCPTR> FUNCMAP; typedef std::multimap<unsigned int, FUNCPTR>::iterator FUNCMAP_ITERATOR; static void CallDoRegister(); private: static int i; static FUNCMAP_ITERATOR m_funcIter; FUNCMAP m_FuncMap; }; //.cpp int CCallFuctionList::i = 0; CCallFuctionList::FUNCMAP_ITERATOR CCallFuctionList::m_funcIter = NULL; CCallFuctionList::CCallFuctionList() { #define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func)) REGISTE_FUNC(SCMD_REGISTER, CallDoRegister); REGISTE_FUNC(SCMD_REGISTER, CallDoRegister); } void CCallFuctionList::CallDoRegister() { i = -1; (m_funcIter->second)(); }

静态函数里面调用的所有类成员都需要设置为静态!你肯定想不就全改成静态的就完了,但静态变量都需要初始化,且静态函数里面调用了静态的Vetor初始化起来比较麻烦,还有种方式,通过一种方式使函数指针调用c++非静态函数。

代码如下:

class CCallFuctionList { public: CCallFuctionList(); virtual ~CCallFuctionList(void); typedef void (CCallFuctionList::*FUNCPTR)(); typedef std::multimap<unsigned int, FUNCPTR> FUNCMAP; typedef std::multimap<unsigned int, FUNCPTR>::iterator FUNCMAP_ITERATOR; void CallDoRegister(); private: FUNCMAP_ITERATOR m_funcIter; FUNCMAP m_FuncMap; int i; }; CCallFuctionList::CCallFuctionList() { #define REGISTE_FUNC(type, func) m_FuncMap.insert(std::make_pair(type, func)) REGISTE_FUNC(SCMD_REGISTER, &CCallFuctionList::CallDoRegister); REGISTE_FUNC(SCMD_REGISTER, &CCallFuctionList::CallDoRegister); } void CCallFuctionList::CallDoRegister() { i = -1; (this->*m_funcIter->second)(); }

传this指针进去,是因为函数指针调用时,默认并没将this传进去,需要自己手动传!

关于函数指针调用C++非静态成员相关推荐

  1. 类的成员函数指针和静态成员函数指针 调用成员函数***

    C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...

  2. C/C++ 函数指针调用函数

    01 //C/C++ 函数指针调用函数 02 #include<iostream> 03 using namespace std; 04   05 void site1() 06 { 07 ...

  3. C++:函数指针调用方法

    函数指针调用普通函数  #include<iostream>using namespace std;void Show()//void(*)() {cout << " ...

  4. 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)

    /* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2014 年 12 ...

  5. 如何用函数指针调用函数

    先举一个用函数指针调用函数的例子 int Func(int x); /*声明一个函数*/ int (*p) (int x); /*定义一个函数指针*/ p = Func; /*将Func函数的首地址赋 ...

  6. 通过函数名调用函数和通过函数指针调用函数有什么区别呢?为什么调用函数指针没有直接调用函数效率高?

     1.通过函数名调用函数和通过函数指针调用函数有什么区别呢? 首先函数名.函数指针都表示代码段的起始地址. 1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才 ...

  7. 友元函数、类的非静态成员函数、静态成员函数的区别

    类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...

  8. 一般函数指针和类(非MFC)的成员函数指针

    函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的 ...

  9. java main方法调用非静态方法_java中main函数怎么调用外部非static方法

    展开全部 方法可以分为静态方法和实例方法 在main函数里调用非static方法(实例方法),那么32313133353236313431303231363533e78988e69d833133336 ...

最新文章

  1. Kinect for Windows V2 SDK+ VS2012 环境搭建
  2. BZOJ3993: [SDOI2015]星际战争
  3. IT行业: 嵌入式工程师的进阶之路
  4. VTK:IO之ReadPLY
  5. 排队机叫号系统服务器安装设置,排队叫号系统设置说明.doc
  6. Objective-C 2.0 with Cocoa Foundation 1 前言
  7. PVS-Studio C/C++/C++11 静态代码分析工具
  8. Oracle触发器2-DML触发器
  9. shell 参数,shell与Java 交互参数
  10. git rebase 和 merge的区别
  11. C语言-概念-文件指针
  12. Data Base学习记录:ER图
  13. 一文了解成分句法分析
  14. Windows调试技巧工具
  15. 防火墙阻止tftp_H3C防火墙常见问题汇总
  16. 修改系统默认的音频设备
  17. GCSE英语语言考试-语言和结构
  18. dsf5.0没登录显示登录弹框
  19. 深度学习与多层神经网络的区别
  20. python-pandapower电力系统潮流计算无法收敛情况解决方法

热门文章

  1. Java总结:正则表达式进行校验
  2. Centos jdk
  3. json数组格式问题
  4. 转 从红帽、GitHub和Docker看开源商业模式的进阶
  5. JS的typeof力所能及已经力所不及
  6. ubuntu 安装yar和使用
  7. 《世界因你而不同-李开复自传》读书笔记(1/3)
  8. [zz]4.1.5 进程的处理器亲和性和vCPU的绑定
  9. 转:EXCEL数据有效性设置
  10. 计算机网络——标准化工作及相关组织