将shared_ptr传递给std :: function(成员函数)

时间:2015-11-06 08:58:53

标签: c++ c++11 shared-ptr std-function

以下观察者类在其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

2 个答案:

答案 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时,它都会为您分配并构造一个新对象。

在你的代码中,你调用它两次,然后你有两个不同的对象实例。

您可以调用一次,并将共享指针保持为您班级的成员。