以下观察者类在其ctor执行时通过调用attach
向主题注册回调函数。我希望观察者的dtor取消注册回调函数。
如何将detach
的指针传递给attach
,以便主题可以将其从观察者列表中删除?
我认为我必须将shared_ptr
存储到this
,但我不确定如何从shared_ptr
到成员函数{{}} {1}}。
有人可以帮忙吗?
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
答案 0 :(得分:1)
我建议也可以在观察者类中存储shared_ptr
的副本,作为成员。然后你可以给它指向detach
的相同指针。
像这样:
class Observer {
//Other Stuff here
private:
std::shared_ptr<std::function<void()>> callback_ptr;
};
Observer::Observer(Subject& subject) :
m_subject(subject),
callback_ptr(std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this))
{
m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)));
}
Observer::~Observer()
{
m_subject.detach("cmd", callback_ptr));
}
值得注意的是,正如@dkg所提到的,make_shared
每次调用时都会返回一个新的shared_ptr
,因为它的目的是&#34;使用以下参数创建一个新对象并向其返回shared_ptr
&#34;。大致相当于shared_ptr(new std::function<void()> (std::bind(&Observer::callback, this))
。
存在额外make_shared
函数的原因是为了最小化分配并保证长表达式中的异常安全性。
如果您只想共享一个对象,那么只需分发shared_ptr
的副本。
答案 1 :(得分:1)
每次调用std::make_shared
时,它都会为您分配并构造一个新对象。
在你的代码中,你调用它两次,然后你有两个不同的对象实例。
您可以调用一次,并将共享指针保持为您班级的成员。