У меня есть объекты запроса с соответствующими объектами ответа. Объект отправителя делает запрос и затем слушает ответ. Один объект отправителя / прослушивателя может отправлять разные запросы. Каждый запрос попадает в глобальную очередь, и после его обработки каждому объекту слушателя отправляется соответствующий ответ.
Есть несколько решений вашей проблемы. Можно было бы сказать, что трансивер информирует все Request
объект о его уничтожении. Для этого вам понадобится такой метод, как
Transceiver::addRequest()
который Request
Объект использует для регистрации себя. в
деструктор Transceiver
Вы должны сообщить всем зарегистрированным Request
«S. Например:
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
,
Других решений пока нет …