最近对编程语言的委托机制产生了浓厚的兴趣,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 |