有个问题想请教一下了解“委托”Delegate的牛人哈~!
有个问题想请教一下了解“委托”Delegate的牛人哈~!
如果有以下的代码实现,那么,这种对于My_Delegate类的使用,是否就等价于C#中的“委托(Delegate)”?(先不考虑委托的异步调用)
c++ 委托 Delegate
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;
}
[解决办法]
My_Delegate是啥?确定重载了+=符号么?
楼主貌似用C#的语法来写C++?
[解决办法]
C++的话可以用 function
[解决办法]
个人理解:
通常“代理模式”中代理者与被代理者具有相同的接口(他们继承自同一接口),一般代理者会包含一个该接口的指针或引用。例如:
struct IInterface
{
virtual void do() = 0;
};
class A :IInterface
{
IInterface* m_pMember;
public :
A(IInterface* pObj){m_pMember = pObj;}
void do(){m_pMember->do();}
};
class B :IInterface
{
IInterface* m_pMember;
public :
void do(){cout<<"do in class B"<<endl;}
}
使用时可以如下:
B b;
A a(&b);
a.do();
如此以来,对外面显示来说,都是A在做事情,但其实A什么都没做,它只是调用了其代理的b对象来完成实际的操作。
对比一下你的代码,可以看出并不符合代理模式。
[解决办法]
委托有点类似于函数指针