Как мне создать надежный объект слушателя?

Предположим, у вас есть классы А & 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. Это определенно приведет к сбою.

Из того, что я прочитал, возможно, что наблюдатель — выбор, но он еще не стандартизирован.

Итак, вот мой вопрос:
Думаю ли я в неправильном направлении?
Есть ли гораздо более простой дизайн?

1

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]