【发布时间】:2015-11-06 08:58:53
【问题描述】:
以下观察者类在其 ctor 执行时通过调用 attach 向主题注册一个回调函数。我希望观察者的 dtor 取消注册回调函数。
如何将相同的指针传递给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);
【问题讨论】:
-
有什么特殊原因导致您不在 ctor 参数列表中使用
const Subject&吗?我问是因为你显然是在复制一个副本。 -
@Superlokkus 因为
Subject::attach不是const。 -
所以
m_subject也是Subject &?否则,您正在创建主题的副本,然后它就无关紧要了。 -
是的,
m_subject是Subject&。 -
只是想确保你得到你想要的:-)。请不要忘记用接受标记答案;-))
标签: c++ c++11 shared-ptr std-function