在C++中用虚函数及模版实现委托(支持多播)
来源:互联网 发布:tcp端口是什么意思 编辑:程序博客网 时间:2024/06/11 23:16
#include "stdio.h"
#include <vector>
using namespace std;
class CObject
{
};
class EventArg
{
public:
unsigned long EventType;
public:
EventArg(unsigned long EventType)
{
this->EventType = EventType;
}
};
class Handler
{
public:
virtual void Invoke(CObject* sender, EventArg* eventArg) = 0;
};
template<class T>
class EventHandler : public Handler
{
typedef void (T::*funptr)(CObject*, EventArg* eventArg);
private:
T* obj;
funptr fun;
public:
EventHandler(T* obj, funptr fun)
{
this->obj = obj;
this->fun = fun;
}
virtual void Invoke(CObject* sender, EventArg* eventArg)
{
(obj->*fun)(sender, eventArg);
}
};
class Event
{
private:
vector<Handler*> handlerList;
public:
Event()
{
}
void FireEvent(CObject* sender, EventArg* eventArg)
{
for(int i = 0; i < handlerList.size(); i++)
{
handlerList[i]->Invoke(sender, eventArg);
}
}
void AddHandler(Handler* handler)
{
handlerList.push_back(handler);
}
void RemoveHandler(Handler* handler)
{
for(int i = 0; i < handlerList.size(); i++)
{
if(handlerList[i] == handler)
{
}
}
}
};
class CSourceEventArg : public EventArg
{
public:
char* sourceArg1;
public:
CSourceEventArg(unsigned long EventType, char* arg1):EventArg(EventType)
{
sourceArg1 = arg1;
}
};
class CSource : public CObject
{
public:
char* name;
Event* event;
EventArg* eventArg;
public:
CSource(char* name)
{
this->name = name;
this->event = new Event();
this->eventArg = new CSourceEventArg(1, "strArg");
}
void fire()
{
this->event->FireEvent(this, eventArg);
}
};
class CProcessor
{
public:
char* name;
CSource* source;
public:
void OnEvent(CObject* sender, EventArg* eventArg)
{
CSource* source = (CSource*)sender;
CSourceEventArg* sourceEventArg = (CSourceEventArg*)eventArg;
printf("Object %s Event %d with Arg %s Processed By %s/n", source->name, sourceEventArg->EventType, sourceEventArg->sourceArg1, this->name);
}
void OnEvent1(CObject* sender, EventArg* eventArg)
{
CSource* source = (CSource*)sender;
CSourceEventArg* sourceEventArg = (CSourceEventArg*)eventArg;
printf("Object %s Event %d with Arg %s Processed By %s Again/n", source->name, sourceEventArg->EventType, sourceEventArg->sourceArg1, this->name);
}
public:
CProcessor(char* msg)
{
name = msg;
source = new CSource("source1");
source->event->AddHandler(new EventHandler<CProcessor>(this, &CProcessor::OnEvent));
source->event->AddHandler(new EventHandler<CProcessor>(this, &CProcessor::OnEvent1));
}
};
int main()
{
CProcessor* processor = new CProcessor("processor1");
processor->source->fire();
return 0;
}
- 在C++中用虚函数及模版实现委托(支持多播)
- 在C++中用虚函数及模版实现委托(支持自定义参数)
- 在C++中用虚函数及模版实现委托(支持自定义参数)(转)
- 在C++中用虚函数及模版实现委托
- 委托及多播委托
- C#--多播委托
- 【C#】委托的多播
- 在C++中实现多播委托(1)
- 在C++中实现多播委托(2)
- 在C++中实现多播委托(3)
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- 模版函数指针,C++委托的实现
- C++中用模板函数指针实现委托
- 在C/C++中用strtok()实现Split函数的功能
- C#==>多播委托
- Mastering Ajax
- WinCE
- VC,BCB,C#,Delphi,Java的委托方案
- 为无LIB的DLL制作LIB函数符号输入库
- 全面剖析雅虎助手以及网络实名的流氓行径(2)
- 在C++中用虚函数及模版实现委托(支持多播)
- 全面剖析雅虎助手以及网络实名的流氓行径(3)
- 全面剖析雅虎助手以及网络实名的流氓行径(4)
- 选择你的RIA方案:Ajax,Flex 还是Applet?
- 测试驱动开发与内存泄漏
- 全面剖析雅虎助手以及网络实名的流氓行径(5)
- C语言高效编程的的四招技巧
- 全面剖析雅虎助手以及网络实名的流氓行径(6)
- 如何防止未经授权地关闭Domino服务器控制台?