一个简单的CPP处理框架
好久没有在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处理框架的更多相关文章
- Node.js简单介绍并实现一个简单的Web MVC框架
编号:1018时间:2016年6月13日16:06:41功能:Node.js简单介绍并实现一个简单的Web MVC框架URL :https://cnodejs.org/topic/4f16442cca ...
- Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用
这里不再介绍effect框架的具体使用,有关effect框架使用可参考http://www.cnblogs.com/zhangbaochong/p/5475961.html 实现的功能依然是画一个简单 ...
- 从零构建一个简单的 Python Web框架
为什么你想要自己构建一个 web 框架呢?我想,原因有以下几点: 你有一个新奇的想法,觉得将会取代其他的框架 你想要获得一些名气 你遇到的问题很独特,以至于现有的框架不太合适 你对 web 框架是如何 ...
- 一个简单的通讯服务框架(大家发表意见一起研究)JAVA版本
最近研究下java语言,根据一般使用的情况,写了个连接通讯服务的框架: 框架结构 C-Manager-S; 把所有通讯内容抽取成三个方法接口:GetData,SetData,带返还的Get; 所有数据 ...
- JavaScript 实现一个简单的MVVM前端框架(ES6语法)
前言 随着前端各大框架的崛起,为我们平时的开发带来了相当的便利,我们不能一直停留在应用层面,今天就自己动手实现一个乞丐版的MVVM小框架 完整代码github地址 效果 html代码 <div ...
- 一个简单 Go Web MVC 框架实现思路
需要的知识点 为了防止你的心里不适,需要以下知识点: Go 基本知识 Go 反射的深入理解 使用过框架 Go Web 服务器搭建 package main import ( "fmt&quo ...
- 用werkzeug实现一个简单的python web框架
使用工具 Pycharm , Navicat , WebStorm等 使用库 Werkzeug用于实现框架的底层支撑,pymysql用于实现ORM,jinja2用于模板支持,json用于返回json数 ...
- [51单片机] 以PWM控制直流电机为例建一个简单的51工程框架
目录 1)功能概述 2)引脚连接 3)框架介绍 4)模块说明 5)复用规则 6)工程链接 1)功能概述 名称:独立按键控制直流电机调速 内容:对应的电机接口需用杜邦线连接到uln2003电机控制端; ...
- 如何写一个简单的基于 Qt 框架的 HttpServer ?
httpserver.h #ifndef HTTPSERVER_H #define HTTPSERVER_H #include <QObject> #include <QtCore& ...
随机推荐
- scrapy 基础组件专题(十四):scrapy CookiesMiddleware源码
一 Scrapy框架--cookie的获取/传递/本地保存 1. 完成模拟登陆2. 登陆成功后提取出cookie,然后保存到本地cookie.txt文件中3. 再次使用时从本地的cookie.txt中 ...
- tensorboard学习笔记
TensorBoard 默认是不会记录每个节点的用时.耗费的内存大小等这些信息的,那么如何才能在图上显示这些信息呢?关键就是如下这些代码,主要就是在 sess.run() 中加入 options 和 ...
- HotSpot VM运行时
HotSpot VM运行时系统为HotSpot JIT编译器和垃圾收集器提供服务和通用API,同时还为VM提供启动.线程管理.JNI(Java本地接口)等基本功能.HotSpot VM运行时环境担当许 ...
- CSS文本控制
CSS文本控制 文本基础设置 字体设置 font-family可定义多个字体,系统会以从左至右的顺序进行查找,如左侧字体不存在,就往右侧找. 为什么要这么做呢?如果你只用了一种字体,而恰好人家电脑上没 ...
- 深度理解SpringIOC,面试你根本不需要慌!
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star! 搜索关注微信公众号 码出Offer 领取各种学习资料! 深度理解Spring IOC(控制反转) 一.IOC概述 I ...
- unity-热更-InjectFix(一)
1 C#热更新预备知识 1.1 mono.cecil注入 使用Mono.Cecil实现IL代码注入 注入之后修改dll,新增mdb文件: 注意,待了解参数注释打开会报错: 1.2 InjectFix ...
- mysql间隙锁
什么是间隙锁(gap lock)? 间隙锁是一个在索引记录之间的间隙上的锁. 间隙锁的作用? 保证某个间隙内的数据在锁定情况下不会发生任何变化.比如我mysql默认隔离级别下的可重复读(RR). 当使 ...
- js中实现继承的方法
目录 借用构造函数 组合继承 原型式继承 寄生式继承 寄生组合式继承 借用构造函数 这种技术的基本思想很简单,就是在子类型构造函数的内部调用超类型的构造函数.另外,函数只不过是在特定环境中执行代码的对 ...
- Vue开发者必会的基础知识盘点
你会Vue吗,你看以下知识点你掌握了多少?实际工作中是否运用的得心应手?如果是,那么恭喜你! Vue中的数据和DOM已经被关联起来,所有的东西都是响应式的.注意我们不再和HTML直接交互.一个Vue应 ...
- uTools - 你的生产力工具集
工具介绍 uTools是一个极简.插件化.跨平台的现代化桌面软件.通过自由选配丰富的插件,打造你得心应手的工具集合. 通过快捷键(默认alt+space)就可以快速呼出这个搜索框.它相当聪明,可以支持 ...