好久没有在csdn上写过东西了,这么多年,一方面是工作忙,下班到家也没有开过电脑了,要陪小孩玩;

下面分享一段代码,是用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__ */

基类的作用是用于提供统一的接口,当然在这里主要是提供一个类的成员函数指针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的框架分析:https://blog.csdn.net/wuquan_1230/article/details/79015656

一个简单的CPP处理框架的更多相关文章

  1. Node.js简单介绍并实现一个简单的Web MVC框架

    编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...

  2. Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用

    这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...

  3. 从零构建一个简单的 Python Web框架

    为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...

  4. 一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本

    最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架: 框架结构 C-Manager-S; 把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get; 所有数据 ...

  5. JavaScript 实现一个简单的MVVM前端框架(ES6语法)

    前言 随着前端各大框架的崛起,为我们平时的开发带来了相当的便利,我们不能一直停留在应用层面,今天就自己动手实现一个乞丐版的MVVM小框架 完整代码github地址 效果 html代码 <div ...

  6. 一个简单 Go Web MVC 框架实现思路

    需要的知识点 为了防止你的心里不适,需要以下知识点: Go 基本知识 Go 反射的深入理解 使用过框架 Go Web 服务器搭建 package main import ( "fmt&quo ...

  7. 用werkzeug实现一个简单的python web框架

    使用工具 Pycharm , Navicat , WebStorm等 使用库 Werkzeug用于实现框架的底层支撑,pymysql用于实现ORM,jinja2用于模板支持,json用于返回json数 ...

  8. [51单片机] 以PWM控制直流电机为例建一个简单的51工程框架

    目录 1)功能概述 2)引脚连接 3)框架介绍 4)模块说明 5)复用规则 6)工程链接 1)功能概述 名称:独立按键控制直流电机调速 内容:对应的电机接口需用杜邦线连接到uln2003电机控制端; ...

  9. 如何写一个简单的基于 Qt 框架的 HttpServer ?

    httpserver.h #ifndef HTTPSERVER_H #define HTTPSERVER_H #include <QObject> #include <QtCore& ...

随机推荐

  1. 李航统计学习方法(第二版)(六):k 近邻算法实现(kd树(kd tree)方法)

    1. kd树简介 构造kd树的方法如下:构造根结点,使根结点对应于k维空间中包含所有实例点的超矩形区域;通过下面的递归方法,不断地对k维空间进行切分,生成子结点.在超矩形区域(结点)上选择一个坐标轴和 ...

  2. Django框架03 /视图相关

    Django框架03 /视图相关 目录 Django框架03 /视图相关 1. 请求相关 2.响应相关 3.FBV和CBV 视图(视图函数和视图类) 3.1 类视图 CBV 3.2 视图函数 FBV ...

  3. C++代码规约--命名约定

    目录 通用命名规则 文件命名 类型命名 变量命名 常量命名 函数命名 宏命名 枚举命名 命名空间命名 命名规则的特例 学习自Google C++编程规约 通用命名规则 函数命名, 变量命名, 文件命名 ...

  4. 用Vue实现一个简单的图片轮播

    本文已收录至https://github.com/likekk/studyBlog欢迎大家star,共同学习,共同进步.如果文章有错误的地方,欢迎大家指出.后期将在将GitHub上规划前端学习的路线和 ...

  5. GPO - AppLocker

    AppLocker can help you: Define rules based on file attributes that persist across app updates, such ...

  6. OSCP Learning Notes - WebApp Exploitation(1)

    Installing XSS&MySQL FILE Download the Pentester Lab: XSS and MySQL FILE from the following webs ...

  7. OneinStack - 自动编译环境安装脚本

    https://oneinstack.com/

  8. Intelij DataGrip 的安装和使用

    链接: Intelij DataGrip 安装教程以及汉化教程 Intelij DataGrip 使用教程 以上两个教程已使用过,没有问题 如有侵权请联系删除

  9. Linux cut 命令详解

    cut 命令在Linux和Unix中的作用是从文件中的每一行中截取出一些部分,并输出到标准输出中.我们可以使用 cut 命令从一行字符串中于以字节,字符,字段(分隔符)等单位截取一部分内容出来. 在本 ...

  10. SQL 更新删除

    -- 插入数据 INSERT INTO [ Salary ] VALUES(25451,4545,45 ) INSERT INTO [ Salary ] (编号,收入,支出) VALUES(25451 ...