回调函数特别适合实现类之间的通信. 类之间的通信, 不同的平台有各自的解决方案, 比如windows有MFC, 这里面就包含大量的回调函数机制, 保证类之间的通信. 这里, 实现一个自定义的回调函数机制, 进行基础的通信.

问题背景:
有一个服务器的类, 服务器有一系列的客户端的集合. 是否断开与服务器的连接由客户端决定. 如果客户端申请断开连接, 那么服务器就要把需要断开链接的客户端从集合中进行清理. 这里就面临一个问题, 申请断开的是客户端, 而执行清理的是服务器, 但是客户端无法直接执行服务器的清理工作. 唯一能做的是, 通知服务器进行清理.

思路:
服务器单独定义一个函数用于清理指定的客户端, 然后把这个函数作为回调函数传递个客户端, 保存为函数对象的类型. 客户端请求断开连接时, 执行服务器的这个函数对象即可.

注意, 这里说的客户端是RPC意义上的客户端, 这么抽象是为了方便程序设计, 这也是C\S架构常用的一个方法.

代码中注意一个地方, 我们需要保证回调的时候, 是删除的断开连接的函数, 因此在Client内部重载比较函数. 因为使用智能指针, 在堆内存上开辟, 所以使用内存地址的比较, 这是唯一的定位符.

代码实例:

#include <iostream>
#include <functional>
#include <set>
#include <memory>class Client {public:void set_cbfunc(std::function<void()> f) {m_cbFunc = std::move(f);}void callback() {std::cout << "client callback id: " << id << std::endl;m_cbFunc();}// 比较函数, 仅仅是为了区分确定的客户端, 方便在容器中比较inline bool operator<(const Client &client) {return bool(this < &client);}inline int getId() const {return id;}inline void setId(int id_) {id = id_;}private:int id;std::function<void()> m_cbFunc;
};class Server {public:void callback(std::shared_ptr<Client> &p) {std::cout << "Server callback, id: " << p->getId() << std::endl;m_pClients.erase(p);}void start() {std::cout << "Before CallBack, Client num: " << m_pClients.size() << std::endl;for (auto &p: m_pClients) {std::cout << "client id: " << p->getId() << std::endl;p->callback();}std::cout << "After CallBackClient num: " << m_pClients.size() << std::endl;}std::set<std::shared_ptr<Client>> m_pClients;
};int main() {Server server;for (int i = 0; i < 5; ++i) {auto it = std::make_shared<Client>();it->setId(i);it->set_cbfunc(std::bind(&Server::callback, &server, it));server.m_pClients.insert(it);}server.start();return 0;
}

输出结果:

Before CallBack, Client num: 5
client id: 0
client callback id: 0
Server callback, id: 0
client id: 3
client callback id: 3
Server callback, id: 3
client id: 1
client callback id: 1
Server callback, id: 1
client id: 4
client callback id: 4
Server callback, id: 4
client id: 2
client callback id: 2
Server callback, id: 2
After CallBackClient num: 0

可以看出, 成功删除了断开链接的客户端, 而且3次确认都是删除正确的.

C++回调函数作为通信机制相关推荐

  1. 【NodeJs-5天学习】第一天篇④ ——了解NodeJs回调函数和事件驱动机制

    [NodeJs-5天学习]第一天篇④ --NodeJs回调函数和事件处理机制 1.Node.js 中的回调(Callback)函数 2.Nodejs事件循环模型 2.1 浅析事件驱动 2.2 深入No ...

  2. 回调函数的注册机制为什么会在嵌入式固件开发中应用如此广泛?

    击上方"嵌入式应用研究院",选择"置顶/星标公众号" 干货福利,第一时间送达! 在我们平时开发STM32或者其它单片机时,我们经常都会用到原厂提供的固件库函数, ...

  3. 回调函数callback function的机制及使用举例

    如果把函数指针传递给另一个函数(调用者),当调用者执行时,函数指针所指的函数也被执行.被调用的函数就是回调函数. 回调函数实现的机制是 1.定义一个回调函数: 2.提供函数实现的一方在初始化的时候,通 ...

  4. 对ajax回调函数的研究

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  5. javascript之回调函数小知识

    Javascript异步编程方法------"回调函数" 这是异步编程最基本的方法. 软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用.回调和异步调用. ...

  6. 回调函数到底是怎么一回事呢

    今天看到回调函数,有点迷糊,找了好多搜索引擎的资料,都不是让我很能理解,看了<c和指针>我才明白了. 简单描述一下什么是回调函数: 用户把一个函数指针作为参数传递给其他函数,后者将&quo ...

  7. jQuery源码研究分析学习笔记-回调函数(11)

    回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数的实现方直接调用,而是在特定的事件 ...

  8. 【C语言】用回调函数实现冒泡排序

    (一)什么是回调函数呢? 回调函数就是通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数. (二)回调函数的实现机制 ...

  9. php回调函数的作用域,PHP将回调函数作用到给定数组单元的方法

    PHP将回调函数作用到给定数组单元的方法 数组是PHP程序设计中十分重要的一环.本文介绍PHP中数组函数array_map()的用法,实现将回调函数作用到给定数组单元上.具体如下: array arr ...

最新文章

  1. python36+centos7离线安装tensorflow与talib的方法
  2. HDFS配置Kerberos
  3. 大道至简,大数据的小窍门
  4. Spring框架-事务管理注意事项
  5. 改变程序设计、图灵奖得主、美国第一位计算机科学女博士,程序媛进击史
  6. EXCEL 绘制斜线表头
  7. 完整的连接器设计手册_连接器卧式插拔力的测试介绍
  8. Unity3D中关于Mesh.MarkDynamic
  9. 用android程序帮美女换衣服源码
  10. 思科CISCO常用命令汇总
  11. 如何找到Google浏览器扩展程序在本地文件夹中的位置?
  12. 人人商城删除后台菜单“小程序”
  13. 鸟哥linux命令行总结之——文件的压缩打包和备份
  14. WindowsCluster 由于在更新安全DNS区域时访问被拒绝,群集网络资源无法注册一个或多个关联的DNS名称
  15. 360奇舞团钟恒:选用Vue.js进行组件化开发,我们遇到了哪些坑?
  16. 大学十年---林锐(转)
  17. 江苏大学创新创业学分计算机学院,江苏大学创新学分评定标准
  18. 大数据实战二十四课 - Spark SQL04
  19. LINUX--创建新用户为新用户设置权限
  20. HTTP和HTTP的区别

热门文章

  1. ubuntu 16.04 R语言安装 rJava package失败解决方案
  2. [查找问题] 例5.1 找x
  3. [转]摧毁一个人可以有多简单
  4. 在eclipse中使用第三方库总结
  5. MySQL学习记录 (五) ----- 存储函数、存储过程和触发器
  6. 使用Node.js的Express框架搭建和开发项目
  7. Nginx详解+身份验证+虚拟主机+反向代理负载均衡
  8. eclipse 常用设置(二)
  9. 【心情】bjdldrz
  10. jquery跨域请求示例