Предположим, у вас есть классы А & B, чьи объекты имеют несвязанные времена жизни:
class A
{
public:
IStateChanger& GetStateChanger() { return mStateChanger; }
private:
StateChanger mStateChanger;
};
class B
{
public:
void Register(IStateChanger& iStateChanger)
{
mpStateChanger = &iStateChanger;
}
void Notify()
{
mpStateChanger->DoSomething();
}
private:
IStateChanger* mpStateChanger;
};
В какой-то момент я регистрирую StateChanger, который я получаю от объекта A, на объекте B.
Теперь А умирает, уничтожая свой собственный StateChanger.
Но B живет и вызывает метод StateChanger, потому что думает, что он все еще жив.
Моя цель — сделать метод Notify () максимально устойчивым.
Конечно, мы могли бы написать автоматическую регистрацию / отмену регистрации с наблюдателями. Это кажется много накладных расходов для меня.
Или передайте слабый_птр, который подразумевает создание StateChanger как shared_ptr в объекте IA. И мне нужно иметь дополнительный метод для возврата уязвимости в IA вместо ссылки, что ужасно, когда кто-то использует A напрямую.
Или я мог бы написать комментарий о том, как правильно использовать API и что убивать IA — это просто, не отменив регистрацию StateChanger в B. Это определенно приведет к сбою.
Из того, что я прочитал, возможно, что наблюдатель — выбор, но он еще не стандартизирован.
Итак, вот мой вопрос:
Думаю ли я в неправильном направлении?
Есть ли гораздо более простой дизайн?
Задача ещё не решена.