为什么我们使用enable_shared_from_this模板?

时间:2018-05-08 14:21:27

标签: c++ c++11 boost shared-ptr c++-standard-library

最近,我遇到了std::enable_shared_from_this<T>模板,该模板与Boost版本相同 所以它描述了以下示例代码:

class Y: public enable_shared_from_this<Y>
{
public:

    shared_ptr<Y> f()
    {
        return shared_from_this();
    }
}

int main()
{
    shared_ptr<Y> p(new Y);
    shared_ptr<Y> q = p->f();
    assert(p == q);
    assert(!(p < q || q < p)); // p and q must share ownership
}

通过f()?创建shared_ptr的原因是什么 问题与shared_ptr<Y> p(new Y);有什么关系?

2 个答案:

答案 0 :(得分:3)

  

shared_ptr p(新Y)有什么问题;?

它没有任何问题,只是问题你可能没有在类Y的成员中,有时你想要一个成员将std::shared_ptr返回给自己。 std::shared_ptr<Y>( this )显然是错误的创建方式。

我想知道这样的例子是否可以让事情变得更清晰,并且仍然足够简单:

std::shared_ptr<Y> Y::getObject() 
{
     return some_condition ? shared_from_this() : std::make_shared<Y>( somedata );
}

答案 1 :(得分:3)

shared_from_this的要点是,当您 已经有权访问<{1}}时,您可以获得shared_ptr。它在你的例子中毫无意义,因为你的例子太简单了。想象一下,某些功能只能获得Y*Y&,并且需要与某人分享所有权。这种情况经常发生在Y成员上,因为成员只能访问this