极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 17616|回复: 8

C++实现回调的一种方式

[复制链接]
发表于 2015-8-27 14:31:49 | 显示全部楼层 |阅读模式
  1. #include <stdio.h>


  2. class EpollInterface{
  3. public:
  4.     EpollInterface(){}
  5.     virtual void epollEvent(){ printf("EpollInterface print\n");}
  6. };

  7. class Epoll : public EpollInterface{
  8. public:
  9.     Epoll(EpollInterface *parent){
  10.         this->parent = parent;
  11.     }

  12.     void print(){
  13.         printf("Epoll print!\n");
  14.     }

  15.     void epollEventHandle() {
  16.         parent->epollEvent();
  17.     }

  18. private:
  19.     EpollInterface *parent;
  20. };

  21. class UsrNeedEpoll : public EpollInterface{
  22. public:
  23.     UsrNeedEpoll() {
  24.         usrEpoll = new Epoll(this);
  25.     }

  26.     void epollEvent() {
  27.         printf("usrEpoll \n");
  28.     }

  29.     Epoll *usrEpoll;
  30. };



  31. int main()
  32. {

  33.     UsrNeedEpoll usr;

  34.     usr.usrEpoll->epollEventHandle();
  35.     return 0;
  36. }
复制代码
回复

使用道具 举报

发表于 2015-9-16 11:08:11 | 显示全部楼层
不要误导人,这不是回调
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-16 19:34:01 | 显示全部楼层
转角 发表于 2015-9-16 11:08
不要误导人,这不是回调

你可以看清楚再说
回复 支持 反对

使用道具 举报

发表于 2015-9-16 20:58:59 | 显示全部楼层
这真不是回调。说它是个重写还不是重写,根本就是两个类里面互相包含了个对象而已。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-18 21:21:57 | 显示全部楼层
转角 发表于 2015-9-16 20:58
这真不是回调。说它是个重写还不是重写,根本就是两个类里面互相包含了个对象而已。

  1. //
  2. //  main.cpp
  3. //  Lambda
  4. //
  5. //  Created by Atropos on 15/9/2.
  6. //  Copyright &#169; 2015年 Atropos. All rights reserved.
  7. //

  8. #include <iostream>
  9. #include <string>
  10. #include "ClassTemplate.hpp"

  11. #include <pthread.h>
  12. #include <unistd.h>

  13. // 串口的事件处理接口
  14. class Event_receive {
  15. public:
  16.     Event_receive() {}
  17.    
  18.     virtual int event(std::string str) = 0;
  19. };

  20. // 串口类定时一秒发一次;
  21. class USART_EXAMPLE {
  22. public:
  23.     USART_EXAMPLE(Event_receive *ptr)
  24.             : _usr(ptr)
  25.     {
  26.         pthread_create(&_pthread, NULL, task, this);
  27.     }
  28.    
  29.     ~USART_EXAMPLE() {
  30.         pthread_join(_pthread, NULL);
  31.     }
  32.    
  33. private:
  34.     // 使用者的指针用于回调接口
  35.     Event_receive *_usr;
  36.    
  37.     // 线程号
  38.     pthread_t _pthread;
  39.    
  40. private:
  41.     // c调用c++的转换接口
  42.     static void * task (void * ptr) {
  43.         USART_EXAMPLE *func = (USART_EXAMPLE *)ptr;
  44.         
  45.         func->taskHandle();
  46.         return 0;
  47.     }
  48.     // 定时发送
  49.     void taskHandle() {
  50.         while (true) {
  51.             sleep(1);
  52.             _usr->event("123");
  53.         }
  54.     }
  55. };


  56. class Usr
  57.     // 实现事件接口
  58.     : public Event_receive
  59. {
  60. public:
  61.     Usr() : _usart(this) {}
  62. private:
  63.     // 实例化一个串口
  64.     USART_EXAMPLE _usart;
  65.    
  66. private:
  67.     // 事件处理函数供串口接收调用
  68.     virtual int event(std::string str)  {
  69.         std::cout << str << std::endl;
  70.         return 1;
  71.     }
  72. };



  73. int main(int argc, const char * argv[]) {
  74.    
  75.     Usr usr;
  76.     return 0;
  77. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2015-9-19 17:06:41 | 显示全部楼层
姑娘啊,你这个例子可以运行是真的,可能你把回调理解错了。你这个只是创建了线程,把对象传递给线程了,并在线程里面用这个对象调用它的函数。这个逻辑可以实现你的要求,但是不能叫它为回调。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-19 19:05:30 | 显示全部楼层
转角 发表于 2015-9-19 17:06
姑娘啊,你这个例子可以运行是真的,可能你把回调理解错了。你这个只是创建了线程,把对象传递给线程了,并 ...

怎么就不叫回调了呢~  这个不叫callback 叫什么呢
回复 支持 反对

使用道具 举报

发表于 2015-9-20 21:50:19 | 显示全部楼层
这就是普通的一个对象调用成员函数。如果你创建线程时候那个参数传递的是函数地址,线程内直接使用这个函数地址的 那叫回调。
当别人提供一个回调接口的时候他们不可能跟你约定对象类型对吧,所以只提供函数入口地址就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-9-21 20:22:47 | 显示全部楼层
转角 发表于 2015-9-20 21:50
这就是普通的一个对象调用成员函数。如果你创建线程时候那个参数传递的是函数地址,线程内直接使用这个函数 ...

成员函数做为参数传递事非常复杂的;其实最好是用闭包来做,但是这样消耗太大了~;C++不像别的语言那样有内省机制,所以这种只是一种中庸方法,利用接口来约定处理事件,这种方式在Qt中也很常见!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 11:14 , Processed in 0.039112 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表