关于函数指针调用C++非静态成员
当在类里面定义函数指针,而函数指针会指向类里面的成员的时候,这个时候成员需要定义为静态成员。实例代码如下:
//.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++非静态成员相关推荐
- 类的成员函数指针和静态成员函数指针 调用成员函数***
C++提供static这个关键词对静态成员进行声明,静态成员函数和类的实例化无关,对于同一类来说,静态成员函数是所有类的对象共享的.而普通成员函数需要实例化才能调用,对于每一个实例来说,普通成员函数是 ...
- C/C++ 函数指针调用函数
01 //C/C++ 函数指针调用函数 02 #include<iostream> 03 using namespace std; 04 05 void site1() 06 { 07 ...
- C++:函数指针调用方法
函数指针调用普通函数 #include<iostream>using namespace std;void Show()//void(*)() {cout << " ...
- 第16周项目3--用函数指针调用函数(吃饭,睡觉,打豆豆)
/* * Copyright (c) 2014, 烟台大学计算机学院 * All rights reserved. * 文件名称:test.cpp * 作 者:刘畅 * 完成日期:2014 年 12 ...
- 如何用函数指针调用函数
先举一个用函数指针调用函数的例子 int Func(int x); /*声明一个函数*/ int (*p) (int x); /*定义一个函数指针*/ p = Func; /*将Func函数的首地址赋 ...
- 通过函数名调用函数和通过函数指针调用函数有什么区别呢?为什么调用函数指针没有直接调用函数效率高?
1.通过函数名调用函数和通过函数指针调用函数有什么区别呢? 首先函数名.函数指针都表示代码段的起始地址. 1)调用函数的时候必须指定函数名,可是当有时候不确定具体调用哪个函数,当某些事件发生后才 ...
- 友元函数、类的非静态成员函数、静态成员函数的区别
类中申明的函数相对于类来说有三层意思: 1.有this指针 2.函数在类的作用区域中 3.可以访问类中私有部分 4.可以被继承 非静态成员函数具有1234 静态成员函数具有234 友元函数具有3 静态 ...
- 一般函数指针和类(非MFC)的成员函数指针
函数指针是通过指向函数的指针间接调用函数.函数指针可以实现对参数类型.参数顺序.返回值都相同的函数进行封装,是多态的一种实现方式.由于类的非静态成员函数中有一个隐形的this指针,因此,类的成员函数的 ...
- java main方法调用非静态方法_java中main函数怎么调用外部非static方法
展开全部 方法可以分为静态方法和实例方法 在main函数里调用非static方法(实例方法),那么32313133353236313431303231363533e78988e69d833133336 ...
最新文章
- Kinect for Windows V2 SDK+ VS2012 环境搭建
- BZOJ3993: [SDOI2015]星际战争
- IT行业: 嵌入式工程师的进阶之路
- VTK:IO之ReadPLY
- 排队机叫号系统服务器安装设置,排队叫号系统设置说明.doc
- Objective-C 2.0 with Cocoa Foundation 1 前言
- PVS-Studio C/C++/C++11 静态代码分析工具
- Oracle触发器2-DML触发器
- shell 参数,shell与Java 交互参数
- git rebase 和 merge的区别
- C语言-概念-文件指针
- Data Base学习记录:ER图
- 一文了解成分句法分析
- Windows调试技巧工具
- 防火墙阻止tftp_H3C防火墙常见问题汇总
- 修改系统默认的音频设备
- GCSE英语语言考试-语言和结构
- dsf5.0没登录显示登录弹框
- 深度学习与多层神经网络的区别
- python-pandapower电力系统潮流计算无法收敛情况解决方法