我如何在C ++中的应用程序上共享“this”实例?

时间:2012-01-24 09:24:31

标签: c++ shared-ptr

说我有:

class Foo
{
public:
    Foo(std::function< void(std::shared_ptr< Foo >) > callback);

    void shareMyFoo()
    {
        callback(std::make_shared< Foo >(this));
    }

    ....
};

调用shareMyFoo()时,有人将有机会复制共享指针。不幸的是,因为它会死 - 也就是说,它的参考计数器降到0--它会杀死我的Foo。我想阻止Foo被自杀。

我想在std::shared_ptr< Foo > sharedSelf_中有一个字段Foo,我会在构造函数中初始化,但这也很便宜。

更一般地说,假设我实例化并存储指向共享指针中的对象的指针,例如(auto foo = std::make_shared< Foo >()),稍后实例想要将自身作为共享指针传递。如何全局更新ref计数器?

N.B。:我希望/需要在我的应用程序中保留我的签名/我的shared_ptr参数。

2 个答案:

答案 0 :(得分:3)

你必须继承std::enable_shared_from_this(n3242§20.7.2.4)。

auto p = (new Foo) -> shared_from_this ();

答案 1 :(得分:3)

查找enable_shared_from_this

class Foo : public std::enable_shared_from_this<Foo>
{
    Foo(std::function< void(std::shared_ptr< Foo >) > callback);
public:
    std::shared_ptr<Foo> create(std::function< void(std::shared_ptr< Foo >) > callback)
    {
        return std::shared_ptr<Foo>(new Foo(std::move(callback)));
    }

    void shareMyFoo()
    {
        callback(shared_from_this());
    }
};