频道栏目
首页 > 程序开发 > 软件开发 > C++ > 正文
C++用纯虚函数实现协议委托的例子
2015-07-09 10:17:44      个评论    来源:骆昊的技术专栏  
收藏   我要投稿

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

#include 
#include 

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

// 前向引用声明
class Person;

// 用纯虚函数设计一个协议
// 实现该协议的类有一个被唤醒的行为
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不也是如此吗?

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 C++ 函数 例子
上一篇:HDU 1561 The more, The Better(树形dp+背包)
下一篇:C++学习笔记之---控制变化的const
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站