我有请求对象与相应的响应对象。发件人对象发出请求,然后监听响应。一个发件人/侦听器对象可能会发送不同的请求。每个请求都会进入全局队列,并在处理完后,将相应的响应发送给每个侦听器对象。请求响应系统
Q
请求响应系统
1
A
回答
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
相关问题
- 1. PROS + Vex Cortex:请求系统信息时无响应
- 2. 什么是iPhone/Android系统响应ARP请求的策略
- 3. Django:消息系统,请求
- 4. Alamofire请求响应?
- 5. axis2请求响应
- 6. HttpPost请求响应
- 7. HTTP请求响应
- 8. ASP.NET - 请求/响应
- 9. CSS响应网格系统
- 10. 如何使用firefox操作系统创建Ajax请求和响应?
- 11. 角2 GET请求响应
- 12. JavaScript请求响应类型
- 13. apache qpid请求 - 响应
- 14. AJAX请求JSONP 503响应
- 15. Mule JMS请求响应
- 16. DELETE请求移动响应
- 17. REST请求和JSON响应
- 18. SOAP请求/响应/使用
- 19. Python请求响应504
- 20. 多个响应AJAX请求
- 21. JSoup:请求JSON响应
- 22. Http请求和响应
- 23. Log RestServiceBase请求和响应
- 24. NSURLSession请求和响应
- 25. 响应与特定请求
- 26. Timepicker不响应ajax请求?
- 27. JUnit Mockito请求和响应
- 28. node.js请求点响应
- 29. JSON请求和响应
- 30. 处理NSURL请求响应
也许共享或弱指针? –