在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;
}

原创粉丝点击