Следующий класс наблюдателя регистрирует функцию обратного вызова с субъектом по вызову attach
, когда его ctor выполняет. Я хотел бы, чтобы dtor наблюдателя отменил регистрацию функции обратного вызова.Передача shared_ptr в std :: function (функция-член)
Как передать тот же указатель на detach
, как я сделал, до attach
, чтобы субъект мог удалить его из списка наблюдателей?
Я думаю, что я должен хранить shared_ptr
к this
, но я не уверен, как я получаю от этого к shared_ptr
функции члена callback
.
Может ли кто-нибудь помочь?
Observer::Observer(Subject& subject) : m_subject(subject),
{
m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}
Observer::~Observer()
{
// I tried this initially but realised that the pointer below
// is different to the one passed to `attach` from the ctor.
m_subject.detach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}
void Observer::callback()
{
// do some stuff
}
attach
и detach
объявлены следующим образом:
void Subject::attach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback);
void Subject::detach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback);
Есть ли особая причина, по которой вы не используете 'const Subject &' в своем списке параметров ctor? Я спрашиваю, потому что вы, очевидно, копируете-копируете копию в любом случае. – Superlokkus
@Superlokkus Потому что 'Subject :: attach' не' const'. – ksl
Так что 'm_subject' является' Subject & ', тоже? В противном случае вы создаете копию своего предмета, а затем это не имеет значения. – Superlokkus