关于成员函数指针与函数指针的区别,简单的说就是成员函数指针是指向类的成员函数,
而函数指针是用于指向普通的静态的函数;
上代码:
首先是一个基类:
#ifndef __BASEINTERFACE_H__ #define __BASEINTERFACE_H__ #include <iostream> using namespace std; class CBaseInterface; typedef int (CBaseInterface::*MsgAction)(int, void *, int); class CBaseInterface { public: CBaseInterface(){}; virtual ~CBaseInterface(){}; }; #endif /* __BASEINTERFACE_H__ */
基类的作用是用于提供统一的接口,当然在这里主要是提供一个类的成员函数指针MsgAction
接下来就是处理框架类:
#ifndef __PROCESSDATA_H__ #define __PROCESSDATA_H__ #include <map> #include "baseInterface.h" using namespace std; class CProcessData { protected: CProcessData(); ~CProcessData(); public: static CProcessData* GetInstance(); int ProcessData(int iID, void *pData, int iDataLen); //处理消息 int RegIdFunction(int iID, MsgAction func); //注册消息处理成员函数 private: map<int , MsgAction>m_FucnMap; //用于存储消息id与处理函数的对应表· static CProcessData* m_pInstance; }; 类实现代码: #include "processData.h" CProcessData::CProcessData() { } CProcessData::~CProcessData() { } int CProcessData::RegIdFunction(int iID, MsgAction func) { m_FucnMap[iID] = func; return 0; } int CProcessData::ProcessData(int iID, void *pData, int iDataLen) { map<int, MsgAction>::iterator iter = m_FucnMap.find(iID); if ( iter != m_FucnMap.end() ) { ((CBaseInterface*)this->*(iter->second))(iID, pData, iDataLen); } else { cout<<"in CProcessData::ProcessData, not find id: "<<iID<<" process func!"<<endl; } return 0; } CProcessData* CProcessData::m_pInstance = NULL; CProcessData* CProcessData::GetInstance() { if ( m_pInstance == NULL ) { m_pInstance = new CProcessData; } return m_pInstance; }
下面是测试用的类:
#include "baseInterface.h" #include "processData.h" class CTest: public CBaseInterface { public: virtual ~CTest(){}; int Init() { CProcessData::GetInstance()->RegIdFunction(1, (MsgAction)&CTest::ProcessData1); CProcessData::GetInstance()->RegIdFunction(2, (MsgAction)&CTest::ProcessData2); return 0; } int ProcessData1(int iId, void *pData, int iLen) { val = 1; cout <<" process cmd1, id: "<<iId<<", iLen: "<<iLen<<", val = "<<val++<<endl; return 0; } int ProcessData2(int iId, void *pData, int iLen) { cout <<" process cmd1, id: "<<iId<<", iLen: "<<iLen<<", val = "<<val++<<endl; return 0; } private: int val; };
下面是测试用的main函数:
#include <iostream> #include "processData.h" #include "test.h" int main(int argc, char **argv) { CTest test; test.Init(); CProcessData::GetInstance()->ProcessData(1, NULL, 2); CProcessData::GetInstance()->ProcessData(2, NULL, 3); return 0; }
编译运行的结果:
编辑
源码下载地址:http://download.csdn.net/download/wuquan_1230/10136342
基于boost的框架分析:基于boost的bind与function的一个简单示例消息处理框架_fensnote的博客-CSDN博客