|
|
本帖最后由 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 © 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]
|
|