请求 - 响应系统

时间:2012-09-04 12:40:14

标签: c++

我有请求具有相应响应对象的对象。发件人对象发出请求,然后侦听响应。一个发送者/侦听者对象可以发送不同的请求。每个请求都进入一个全局队列,在处理之后,相应的响应被发送到每个侦听器对象。

1 个答案:

答案 0 :(得分: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的破坏 只要它在使用中。你可以使用std::shared_ptr<Transceiver> m_target Request类,这意味着收发器至少与相关请求一样长。

为了更灵活,还有std::weak_ptr<Transceiver>的可能性。然后在请求时可以销毁收发器 还活着。但是,当您尝试使用std::weak_ptr<Transceiver>::lock()时 失败,你知道Transceiver已经死了。

修改:添加了一种方法,以便在Request之前销毁Transceiver时将其删除。