有个问题想请教一下了解“委托”Delegate的牛人哈~!

BoweirrKing 2013-01-29 11:21:31
如果有以下的C++的代码实现,那么,这种对于My_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;
}
...全文
219 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
BoweirrKing 2013-02-01
  • 打赏
  • 举报
回复
这两天把这一想法已经初步实现了,大家请到新帖中查看: http://bbs.csdn.net/topics/390362745
BoweirrKing 2013-01-31
  • 打赏
  • 举报
回复
大家一起帮忙看看,这样的用法,是否算是一种比较规范的委托的用法呢?我尽量遵循开放封闭原则了。

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);//将方法设置成了一个参数,传入后调用
}
threenewbee 2013-01-30
  • 打赏
  • 举报
回复
代码不全,不好判断,感觉这不是托管的代码,所谓My_Delegate是一个委托,只是在API层面上的一个模拟。
宝_爸 2013-01-30
  • 打赏
  • 举报
回复
My_Delegate的定义看不到。 C#就是强类型的函数指针了。
BoweirrKing 2013-01-30
  • 打赏
  • 举报
回复
简单的讲,我的这几行代码的功能就是: 代码执行到某处的时候,会自动调用 通过My_Delegate对象 告知的某个实例的某个方法。 这个到底算不算是“委托”呢?? My_Delegate的构造函数的定义是:My_Delegate(ref obj,ref obj.Method). 其他的部分就是运算符重载了。 这里只是个大意,在C#里可能有语法错误,大家能明白就行:)
BoweirrKing 2013-01-30
  • 打赏
  • 举报
回复
修改了一下,CClassWork,这样的话,其工作模式,是不是更像C#的委托了呢??
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
stonespace 2013-01-30
  • 打赏
  • 举报
回复
My_Delegate 在哪里定义?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧