C++实现委托及分析
作者:网络转载 发布时间:[ 2013/1/29 10:57:16 ] 推荐标签:
近对编程语言的委托机制产生了浓厚的兴趣,C#,Objective-c的委托机制已经是各自强有力的编程规范工具,以下文字和代码是我近日对委托机制的理解,不妥之处,请及时指出。
自我感觉C#的委托针对的对象是函数,学习它的用法会发现它有些像C语言的函数指针,而Objective-c的委托针对的对象是一个对象指针,这在我写的文章对Objective-c委托的理解一文中可以清楚得看到,很容易的理解到。回过头来说C#的委托,在C语言里面是函数指针,给个概念是回调,只不过官方说C#的实现是更加安全的函数指针,我是目前理解不能了,因为我还没有达到那个高度。
来关注我们的主角:C++。针对对象模式的委托,用个观察者模式能很容易实现了,而且有关C++的观察者模式实现也是这样考虑的;那么对于函数指针的委托可以实现吗?现如今已经实现了,也已经用到工程中去了,不过我们还是好好研究一下好,因为我们的C++可是很难学的,我们必须掌握它的一点一滴。
C++中回调一般似于这样:
typedef void (*Fun)();
void function(Fun fun) {...}
我一直不明白啥是回调,但当我看到这个的时候我明白了,“调用你,终还是要调用我”。
如何把它加入,融合观察者设计模式的通知机制呢?网上有很多解法,我也拷贝来了一份,把它加上注解,和大家一起学习。
//event.h
#ifndef _EVENT_H_
#define _EVENT_H_
#include <string>
#include <iostream>
#include <vector>
using namespace std;
template <typename Handler>
class event //模板类,这决定了这个委托可以委托任何类型了函数指针,只要你有,我能委托
{
public:
event()
{
}
event& operator+= (const Handler v)
{
add(v);
return *this;
}
event& operator-= (const Handler v)
{
remove(v);
return *this;
}
vector<Handler>& GetEvent()
{
return m_HandlerList;
}
protected:
virtual void add(Handler v)
{
m_HandlerList.push_back(v);
}
virtual void remove(const Handler v)
{
vector<Handler>::iterator it = m_HandlerList.begin();
for( ; it != m_HandlerList.end() ; it++)
{
if((*it) == v)
{
m_HandlerList.erase(it);
break;
}
}
}
private:
vector<Handler> m_HandlerList;
};
#endif
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11