2012-09-04 45 views
1

我有请求对象与相应的响应对象。发件人对象发出请求,然后监听响应。一个发件人/侦听器对象可能会发送不同的请求。每个请求都会进入全局队列,并在处理完后,将相应的响应发送给每个侦听器对象。请求响应系统

+2

也许共享或弱指针? –

回答

2

您的问题有几种解决方案。一个是,收发器通知所有Request对象关于其销毁。为此,您需要一种方法,如 Transceiver::addRequest(),其中一个Request对象用于注册自己。在破坏者Transceiver你必须通知所有注册Request的。例如:

class Transceiver 
{ 
    virtual ~Transceiver() 
    { 
     for (auto request : m_requests) 
      request->deleteTransceiver(this); 
    } 

    void addRequest(Request* r) 
    { 
     m_requests.push_back(r); 
    } 

    void removeRequest(Request* r) 
    { 
     m_requests.erase(std::remove(m_requests.begin(), m_requests.end(), r), 
         m_requests.end()); 
    } 

    std::vector<Request*> m_requests; 
}; 

class Request 
{ 
    virtual void deleteTransceiver(Transceiver* t) = 0; 
    virtual void notify() = 0; 
}; 

class RequestImpl : public Request 
{ 
    RequestImpl(Transceiver* t) 
     : m_target(t) 
    { 
     if (t) 
      t->addRequest(this); 
    } 

    ~RequestImpl() 
    { 
     if (m_target) 
      m_target->removeRequest(this); 
    } 

    virtual void deleteTransceiver(Transceiver* t) 
    { 
     if (m_target == t) 
      m_target = 0; 
    } 

    virtual void notify() 
    { 
     if (m_target) 
      m_target->process(ResponseType()); 
    } 

    Transceiver* m_target; 
}; 

第二种方法当然会是防止Transceiver作为 长的破坏,因为它是在使用中。您可以在 Request类中使用std::shared_ptr<Transceiver> m_target,这意味着收发器的寿命至少与关联的请求一样长。

为了更灵活一些,还可以使用std::weak_ptr<Transceiver>。然后,当请求 仍然存在时,收发器可能被破坏。但是,当您尝试std::weak_ptr<Transceiver>::lock()并且它 失败时,您知道Transceiver已死亡。

编辑:增加了一个方法,如果这是它Transceiver之前销毁删除Request

+0

好吧,那很简单。谢谢! – catscradle