C++实例-用C++模拟C#事件机制.docx
上传人:王子****青蛙 上传时间:2024-09-10 格式:DOCX 页数:8 大小:13KB 金币:10 举报 版权申诉
预览加载中,请您耐心等待几秒...

C++实例-用C++模拟C#事件机制.docx

C++实例-用C++模拟C#事件机制.docx

预览

在线预览结束,喜欢就下载吧,查找使用更方便

10 金币

下载此文档

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

C++实例:用C++模拟C#事件机制C#delegate本质上是一个函数的面对对象的封装,在C++语言中函数分好多种,包括全局函数,成员函数,函数对象(即functor,虽然不是函数,但由于行为像函数,所以归为函数一类),考试.大提示因此在C++里实现delegate的关键就是封装上述3类函数的不同,对外供应全都的接口,先来看一下delegate的实现。templateclassDelegate{public:Delegate(){}virtual~Delegate(){}public:typedefTReturn(*InvokerType)(TArgumentargs);//forglobalorstaticmethodsDelegate(TReturn(*pCallback)(TArgument)):m_pInvoker(NULL){Invoker::Bind(pCallback);m_pInvoker=Invoker::Invoke;}//forobjectmembermethodstemplateDelegate(TObject*pObject,TReturn(TObject::*pCallback)(TArgument)):m_pInvoker(NULL){MemberInvoker::Bind(pObject,pCallback);m_pInvoker=MemberInvoker::Invoke;}//forfunctormethodstemplateDelegate(TFunctor*pCallback):m_pInvoker(NULL){FunctorInvoker::Bind(pCallback);m_pInvoker=FunctorInvoker::Invoke;}TReturnoperator()(TArgumentargs){returnm_pInvoker(args);}//implementationsprivate:InvokerTypem_pInvoker;};delegate本身就是一个函数对象,针对C++里3类函数供应了3个构造函数,每个构造函数的实现分别用到了一个帮助类别,分别是Invoker(用于全局函数或者类的静态函数),MemberInvoker(用于类成员函数),FunctorInvoker(用于functor),这三个帮助类别主要用于在编译时保存函数类型,对象类型等信息。实现如下:templatestructInvoker{typedefTReturn(*Method)(TArgumentargs);staticTReturnInvoke(TArgumentargs){returnm_pCallback(args);}staticvoidBind(MethodpCallback){m_pCallback=pCallback;}private:staticMethodm_pCallback;};templatetypenameInvoker::MethodInvoker::m_pCallback=NULL;templatestructMemberInvoker{typedefTReturn(TObject::*MemberMethod)(TArgument);staticTReturnInvoke(TArgumentargs){return(m_pObject->*m_pCallback)(args);}staticvoidBind(TObject*pObject,MemberMethodpCallback){m_pObject=pObject;m_pCallback=pCallback;}private:staticTObject*m_pObject;staticMemberMethodm_pCallback;};templateTObject*MemberInvoker::m_pObject=NULL;templatetypenameMemberInvoker::MemberMethodMemberInvoker::m_pCallback=NULL;templatestructFunctorInvoker{typedefTFunctor*FunctorMethod;staticTReturnInvoke(TArgumentargs){returnm_pCallback(args);}staticvoidBind(FunctorMethodpCallback){m_pCallback=pCallback;}private:staticFunctorMethodm_pCallback;};templatetypenameFunctorInvoker::FunctorMetho