C++实现委托及分析

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

上面这份代码实现了C#的事件(可能假设有问题)

//myclass.h
#ifndef _MYCLASS_H_
#define _MYCLASS_H_
#include <string>
#include <iostream>
#include <vector>
#include "event.h"
typedef void(*EventHandler)(); 
class MyClass
{
public: 
		MyClass(){}
		void FireEvent() 
		{ 
			size_t nCount = AEvent.GetEvent().size(); 
			for (size_t i = 0 ; i < nCount ; i++) 
			{ 
				(*(AEvent.GetEvent().at(i)))();
			} 	
		} 
public:
	event <EventHandler> AEvent;
};
#endif

上面这份代码实现了C#的委托(可能假设有问题)

//main.cpp
#include "myclass.h " 
void MyEventHandler()
{
	printf("This is a event!\n"); 
}
void MyEventHandlor()
{
	printf("This is another event!\n");
}
int main(int argc,char* argv[]) 
{ 
	MyClass Obj;
	Obj.AEvent += MyEventHandler;
	Obj.AEvent += MyEventHandlor;
	Obj.FireEvent();
	Obj.AEvent -= MyEventHandler;
	Obj.FireEvent();
	printf("Over!\n");
	system("pause");
	return   0; 
} 
上面这份代码用于测试
三份代码实现了一个观察者模式,这儿的Subject是MyClass,Obverser是MyEventHandler()和MyEventHandlor()两个函数,形如Obj.AEvent += 函数指针就是添加一个通知对象,-=就是去掉一个通知对象,FireEvent()函数就是执行通知的函数。

分析与代码同在,谢谢观赏!





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值