一个简单的CPP处理框架

简介: 下面分享一段代码,是用CPP做的一个简单的消息(协议)处理框架,是通过成员函数指针+map来实现的。


关于成员函数指针与函数指针的区别,简单的说就是成员函数指针是指向类的成员函数,

而函数指针是用于指向普通的静态的函数;



上代码:

首先是一个基类:

#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__ */

image.gif



基类的作用是用于提供统一的接口,当然在这里主要是提供一个类的成员函数指针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;
}

image.gif



下面是测试用的类:


 

#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;
};

image.gif



下面是测试用的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;
}

image.gif






编译运行的结果:


image.gif编辑


 

源码下载地址:http://download.csdn.net/download/wuquan_1230/10136342

基于boost的框架分析:基于boost的bind与function的一个简单示例消息处理框架_fensnote的博客-CSDN博客


目录
相关文章
|
2月前
|
算法 开发者
【Qt SDL相关问题】Qt 引入SDL导致main函数冲突的解决方案
【Qt SDL相关问题】Qt 引入SDL导致main函数冲突的解决方案
30 2
|
12月前
CPP2022-10-函数01(下)
CPP2022-10-函数01(下)
33 0
|
12月前
CPP2022-03
CPP2022-03
35 0
|
12月前
CPP2022-10-函数01(上)
CPP2022-10-函数01
24 0
|
C++ iOS开发
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
708 0
iOS开发 -- 在Xcode中引入cpp文件,并调用cpp文件中的方法
Ogrekit共享库main.cpp源码
Ogrekit共享库main.cpp源码
58 0
|
关系型数据库 数据库 Python

热门文章

最新文章

  • 1
    流量控制系统,用正则表达式提取汉字
    25
  • 2
    Redis09-----List类型,有序,元素可以重复,插入和删除快,查询速度一般,一般保存一些有顺序的数据,如朋友圈点赞列表,评论列表等,LPUSH user 1 2 3可以一个一个推
    26
  • 3
    Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
    26
  • 4
    Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
    27
  • 5
    S外部函数可以访问函数内部的变量的闭包-闭包最简单的用不了,闭包是内层函数+外层函数的变量,简称为函数套函数,外部函数可以访问函数内部的变量,存在函数套函数
    24
  • 6
    Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
    30
  • 7
    Redis05数据结构介绍,数据结构介绍,官方网站中看到
    22
  • 8
    JS字符串数据类型转换,字符串如何转成变量,+号只要有一个是字符串,就会把另外一个转成字符串,- * / 都会把数据转成数字类型,数字型控制台是蓝色,字符型控制台是黑色,
    20
  • 9
    JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
    20
  • 10
    定义好变量,${age}模版字符串,对象可以放null,检验数据类型console.log(typeof str)
    19