Общий указатель, использующий (эту) регистрацию для наблюдателя - PullRequest
0 голосов
/ 20 июня 2019

У меня проблема при попытке использовать общий указатель из класса, который хочет зарегистрироваться наблюдателю (используя), вот пример.

Observer.hpp

class Observer {
virtual void update() = 0;
}

Consumer.hpp

class Consumer : public Observer {
virtual void update() override;
}

Consumer.cpp

class Consumer {
***

ЭТО НЕ РАБОТАЕТ - Как это сделать с помощью общих указателей ??


register.registerObserver(std::make_shared<Observer>(this));
}

Register.cpp

class Register {
void registerObserver(const std::shared_ptr<Observer>& observer);
}

1 Ответ

1 голос
/ 20 июня 2019

Вы никогда не должны использовать make_shared или иным образом создавать shared_ptr из этого.

Кроме того, никогда не комбинируйте методы управления памятью, если вы не уверены, что знаете и полностью понимаете, что делаете.

Если вам действительно нужно shared_ptr, ссылающееся на текущий объект, вы должны вместо этого создать объект как shared_ptr в первый раз и иметь наследуемый класс enable_shared_from_this .

После этого, когда вам нужен общий указатель, используйте shared_from_this

Поскольку у вас есть это, вы уже сконструировали свой объект, и использование прямого указателя для создания из него другого общего указателя приведет к тому, что ваша ссылка будет уничтожена, как только одна из ваших ссылок shared_ptr достигнет 0, а у другой будет недопустимый ссылка.

...