关闭

C++用纯虚函数实现协议委托的例子

标签: 协议委托纯虚函数回调函数式编程
3751人阅读 评论(6) 收藏 举报
分类:

  C++不像其他很多编程语言有接口、委托或者协议的概念,但是利用纯虚函数和C++多重继承的特性,我们也能实现接口、委托或协议要做的事情,下面的通过一个人设置闹钟然后被闹钟唤醒的例子来说明如何在C++中实现委托回调。

#include <iostream>
#include <unistd.h>

using std::cout;
using std::endl;

// 用纯虚函数设计一个协议
// 实现该协议的类有一个被唤醒的行为
class Awakable {
public:
    // 纯虚函数
    virtual void beAwaken() = 0;
};

// 闹钟类
class AlarmClock {
public:
    // 委托方(谁委托了闹钟提供唤醒服务)
    Awakable *delegate;
    // 在指定时间后报警
    void alarmAfter(int) const;
};

void AlarmClock::alarmAfter(int seconds) const {
    sleep(seconds);
    cout << "叮咚 叮咚 叮咚" << endl;
    // 回调委托方的方法
    delegate->beAwaken();
}

// 人类(实现了Awakable协议可以被唤醒)
class Person : public Awakable {
public:
    // 启动闹钟并指定唤醒时间
    void rollClock(int);
    // 协议中的被唤醒的行为
    void beAwaken();
};

void Person::rollClock(int seconds) {
    cout << "人设置了闹钟" << seconds << "秒后响铃" << endl;
    // 在栈上创建闹钟对象
    AlarmClock ac;
    // 设置委托方
    ac.delegate = this;
    ac.alarmAfter(seconds); 
}

void Person::beAwaken() {
    cout << "人被闹钟唤醒了" << endl;
}

int main(void) {
    // 在堆上创建人的对象
    Person *person = new Person;
    // 人启动闹钟设置5秒后被唤醒
    person->rollClock(5);
    // 释放指针指向的堆空间
    delete person;
    return 0;
}

  程序写到这里,我相信已经不用更多的言语来解释如何实现协议委托了。其实各种编程语言的表象千变万化但是实质几乎没有区别。类似的功能在Java中用接口(interface)可以做到,在C#中可以使用委托(delegate),在Objective-C中可以使用协议(protocol),Swift中也有协议这个概念。但是如果你能够理解函数式编程的理念,还有更简单有效的方式就是使用Lambda函数,将一个回调函数直接作为参数传入一个函数或方法中,而Java(Java 8)和C#中都提供了Lambda表达式,OC中也有block来实现相同的功能。那么C++呢,别忘了C++中还有仿函数(函数对象)的概念,这些不都是一致的吗?当然,支持函数式编程范式的语言就更不用说了,就像JavaScript中可以把函数传入函数中,Swift不也是如此吗?

4
0
查看评论

C++实现委托机制(一)

如果你接触过C#,你就会觉得C#中的delegate(委托)十分灵巧,它的用法上和C\C++的函数指针很像,但是却又比C\C++的函数指针更加灵活。并且委托可以一对多,也就是可以注册多个函数,甚至是某个类的非静态成员函数。而实现事件消息机制【1】也十分依赖于委托机制。基于这样的目的,我们试着在C++...
  • y1196645376
  • y1196645376
  • 2016-05-14 23:01
  • 5884

在C++中实现委托(Delegate)

在C++中实现委托(Delegate) 标签: C++设计模式 2016-03-18 21:04 494人阅读 评论(1) 收藏 举报  分类: C/C++(166)  设计模式(28)&...
  • jfkidear
  • jfkidear
  • 2016-09-28 22:01
  • 649

设计模式--委托模式 C++实现

原文章地址:http://www.cnblogs.com/zplutor/archive/2011/09/17/2179756.html 【委托模式 C++实现】 我对.Net的委托模型印象很深刻,使用委托,可以快速实现观察者模式,免去写很多繁杂重复的代码。遗憾的是,C++并没有...
  • xgx198831
  • xgx198831
  • 2015-07-31 16:02
  • 1820

在C++中实现委托(Delegate)

原文地址 个人理解: 说明: 最近在阅读设计模式相关的内容, 正好看到观察者模式的部分, 发现.net 有一个委托机制, 本质上就是函数指针对象。 这篇大作中, 介绍了C++ 没有提供委托机制, 不过委托机制的本质就是调用成员函数的函数指针,实现回调。 不过...
  • zhyh1435589631
  • zhyh1435589631
  • 2016-03-18 21:04
  • 2549

在你的C++程序里实现委托

在你的C<!-- p.MsoNormal {mso-style-parent:""; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; font-size:10.5pt; fon...
  • cambest
  • cambest
  • 2004-04-12 12:51
  • 1507

C++实现的委托机制(1)

C++实现的委托机制(1) 1.引言 下面的委托实现使用的MyGUI里面的委托实现,MyGUI是一款强大的GUI库,想理解更多的MyGUI信息,猛击这里http://mygui.info/  最终的代码可以在这里下载:http://download.csdn.net/det
  • gouki04
  • gouki04
  • 2011-10-08 14:36
  • 3353

C#委托实现C++ Dll中的回调函数

很多的Dll都是C和C++写的,那么如果C#想要调用Dll中的函数怎么办,尤其是Dll函数其中一个参数是函数指针的,即里面有回掉函数的用C#怎么实现? C中的回掉函数在C#中有中特殊的处理方式叫委托,即要实现的回掉函数委托给另一个和它返回值类型以及函数参数类型、数量一样的方法来实现。 一...
  • ferrycooper
  • ferrycooper
  • 2017-03-18 17:26
  • 3597

C++实现委托及分析

最近对编程语言的委托机制产生了浓厚的兴趣,C#,Objective-c的委托机制已经是各自强有力的编程规范工具,以下文字和代码是我近日对委托机制的理解,不妥之处,请及时指出。 自我感觉C#的委托针对的对象是函数,学习它的用法会发现它有些像C语言的函数指针,而Objective-c的委托针对的对象是...
  • ma52103231
  • ma52103231
  • 2012-05-18 17:54
  • 2669

理解C++实现委托原理

<br />      在C#中有事件委托的概念,  我们可以方便的将一个类中的事件传递到另一个事件处理类中, 其实现的耦合性很底, 两个类之间不需要实例关联,  但在C++中并没有这种内置的功能, ...
  • study_live
  • study_live
  • 2010-09-06 09:57
  • 1420

C++实现委托机制(二)

上一篇文章已经介绍了如何构建一个无参数无返回值的函数指针的委托,这篇文章将对上一文章所述委托进行扩展,使得可以注册任意函数指针,不过再讲篇内容之前先要介绍一下实现这个功能所需要了解的C++11的一个新特性———可变参数模板。
  • y1196645376
  • y1196645376
  • 2016-05-15 11:59
  • 4309
    个人资料
    • 访问:2131108次
    • 积分:9138
    • 等级:
    • 排名:第2425名
    • 原创:116篇
    • 转载:0篇
    • 译文:0篇
    • 评论:806条
    文章分类
    最新评论