极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10640|回复: 0

C++ 学习,不定期更新!!!(主要是C++11)

[复制链接]
发表于 2015-12-7 21:32:53 | 显示全部楼层 |阅读模式
本帖最后由 SproutME 于 2015-12-10 22:46 编辑



用 functional 和lambda 实现的函数回调功能;析构函数用虚函数,实现多态这样可以保证内存的被全部释放;

[pre lang="arduino" line="1" file="AnaBit"]#include <stdio.h>

#include <string>
#include <iostream>
#include <functional>

using std::cout;
using std::endl;
using std::string;
using std::function;

class Arduino {
public:
    Arduino();
    virtual ~Arduino();
   
    void setCallBackFunc(function<void(void)> func);
    void action();
   
private:
    function<void(void)> _func;
};

Arduino::Arduino() {
    cout << "Arduino" << endl;
}

Arduino::~Arduino() {
    cout << "~Arduino" << endl;
}

void Arduino::setCallBackFunc(function<void(void)> func) {
    _func = func;
}

void Arduino::action() {
    if (_func) {
        _func();
    }
}


class Kit : public Arduino {
public:
    Kit();
    virtual ~Kit();
   
private:
   
};

Kit::Kit() {
    cout << "Kit" << endl;
}

Kit::~Kit() {
    cout << "~Kit" << endl;
}

int main(int argc, const char * argv[]) {
   
    Arduino ard;
   
    ard.setCallBackFunc([] () {
        cout << "Arduino" << endl;
    });
   
    ard.action();
   
    Arduino *ptr = new Kit;
    delete ptr;

    return 0;
}
[/code]

利用接口实现C++回调,C++ 在做回调的时候是特别麻烦的一件事,成员函数是包含一个this指针的;纯c代码没有那么多限制;下面使用接口类来实现回调;

[pre lang="arduino" line="1" file="main"]//
//  main.cpp
//  Lambda
//
//  Created by Atropos on 15/9/2.
//  Copyright &#169; 2015年 Atropos. All rights reserved.
//

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

#include <string>
#include <iostream>

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

class Interface {
public:
    Interface() {}
    virtual ~Interface() {}
   
public:
    virtual void setup() = 0;
    virtual void loop() = 0;
    // 虚汗数实现多态, 子类重写了这个函数就会掉用之类的方法
    virtual void interrupt_exit0(int ev_value) {
        printf("this is base class func!!!\n");
    }
};

class Achieve : public Interface{
public:
    Achieve() {}
    // 协变 重写又叫覆盖(区别于 重载和隐藏)
    virtual ~Achieve() {}
   
private:
    void setup() {}
    void loop() {}
    // 这个函数注释掉就会调用父类的方法,
    // 子类重写了父类的方法,实现了多态。这个不是覆盖是重写,实现不一样的;
    void interrupt_exit0(int ev_value) {
        printf("this is sub class func!!!\n");
    }
};

class ArduinoSysBase {
public:
    ArduinoSysBase() {
        // 构造子类的实例,从而掉用之类的方法
        _ptr = new Achieve();
        pthread_create(&_pthreadid, nullptr, cpp2cFunc, this);
    }
    virtual ~ArduinoSysBase() {}
   
private:
    void funcTask() {
        while (true) {
            _ptr->interrupt_exit0(1);
            sleep(1);
        }
    }
   
    static void *cpp2cFunc(void *ptr) {
        ArduinoSysBase *func = (ArduinoSysBase *)ptr;
        func->funcTask();
        return nullptr;
    }
   
private:
    pthread_t _pthreadid;
   
private:
    // 定义接口指针
    Interface *_ptr;
};

// 现在实现 Arduino的那种调用方式
int main(int argc, const char * argv[]) {
   
    ArduinoSysBase base;
   
    pause();
    return 0;
}
[/code]

回复

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-15 17:27 , Processed in 0.053262 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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