我有具有相应响应对象的请求对象。Sender 对象发出请求,然后侦听响应。一个发送者/监听者对象可以发送不同的请求。每个请求都进入一个全局队列,处理完毕后,相应的响应将发送到每个侦听器对象。
问问题
543 次
1 回答
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
使用时破坏 a。您可以std::shared_ptr<Transceiver> m_target
在
Request
类中使用 a ,这意味着收发器的寿命至少与相关请求一样长。
为了获得更多的灵活性,还可以使用std::weak_ptr<Transceiver>
. 然后,当请求仍然存在时,收发器可能会被破坏。但是,当您尝试 astd::weak_ptr<Transceiver>::lock()
并且它失败时,您就知道aTransceiver
已经死了。
编辑:添加了一种方法来删除 aRequest
如果它在其Transceiver
.
于 2012-09-04T12:58:04.613 回答