110,534
社区成员
发帖
与我相关
我的任务
分享
class CClassA
{
public:
CClassA(){m_iClassA=100;}
int m_iClassA;
void OnEventHandler(void *pSource)
{
printf("[CClassA]Event comes from source :0x%08X\n",pSource);
}
};
//CClassB、CClassC类似,省略。。。
CClassA a;
CClassB b;
CClassC c;
class CClassWork
{
public:
CClassWork()
{//My_Delegate是一个C++的类,里面存储了成员函数的地址与相应的对象指针
m_dg=My_Delegate(&a,&CClassA::OnEventHandler);
m_dg+=My_Delegate(&b,&CClassB::OnEventHandler);
m_dg+=My_Delegate(&c,&CClassC::OnEventHandler);
}
void StartWork()
{
printf("Work done! Fire event!\n");
m_dg.Invoke(this);//发出事件,在事件响应链中,依次调用了CClassA、CClassB、CClassC的OnEventHandler函数。
}
protected:
My_Delegate m_dg;
};
//主函数开始
int main(int argc, char* argv[])
{
CClassWork mywork;
mywork.StartWork();
getch();
return 0;
}
class CKeepManager
{
public:
CKeepManager()
{
}
void KeepPet(char* name,My_Delegate &MethodOfKeepPets)
{
MethodOfKeepPets(this,name);//通过重载“()”运算符实现。第一个参数是sender,就是C#中,事件回调函数中的那个参数sender。在这里,指明此回调的来源,就是当前对象本身。
}
//////////////////////////////////////////////////////////////////////////
void KeepDogs(void* pSource,char* name)
{
printf("%s,需要到商店A买狗粮\n",name);
}
void KeepCats(void* pSource,char* name)
{
printf("%s,需要到商店B买猫粮\n",name);
}
};
int main(int argc, char* argv[])
{
CKeepManager KM;
My_Delegate methodOfKeepPets(&KM,&CKeepManager::KeepDogs);//将对象实例与对象方法,关联到“委托实例”中。
//在这个例子中,有点特殊,sender与接收者都是KM对象。
KM.KeepPet("养狗",methodOfKeepPets);//将方法设置成了一个参数,传入后调用
}
class CClassWork
{
public:
//.........
void StartWork()
{
printf("Work done! Fire event!\n");
My_Delegate theDelegate(&a,&CClassA::OnEventHandler);
theDelegate+=My_Delegate(&b,&CClassB::OnEventHandler);
theDelegate+=My_Delegate(&c,&CClassC::OnEventHandler);
MethodOfWork_Using_Delegate(theDelegate);
}
void MethodOfWork_Using_Delegate(My_Delegate & theDelegateObj)
{
theDelegateObj.Invoke(this);//发出事件,在事件响应链中,依次调用了CClassA、CClassB、CClassC的OnEventHandler函数。
}
};
我参考了这里的文章:
http://www.cnblogs.com/zhili/archive/2012/10/22/Delegate.html