【问题标题】:Why do we use enable_shared_from_this template?为什么我们使用 enable_shared_from_this 模板?
【发布时间】:2018-10-18 13:00:30
【问题描述】:

最近遇到了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&lt;Y&gt; p(new Y); 有什么问题?

【问题讨论】:

  • 未透露姓名且不可见的投票者,请考虑发表评论
  • 不是我,但我不确定你在问什么。您可以在共享指针中使用新变量。您需要此实例方法来获取共享引用计数的事物:stackoverflow.com/questions/712279/…
  • 这是一个糟糕的例子,因为你可以使用auto q = p;
  • @EduardRostomyan 你在这里不需要shared_from_thisstd::shared_ptr&lt;Y&gt; q = p; 在这里很好。 shared_from_this 仅在您需要 shared_ptr 到已由 shared_ptr 拥有的实例但您无法直接访问该指针的副本时才相关。
  • @Eljay "一个学派" 另一个“学派”说如果一个对象是“自我意识的”,这应该是一个很好的理由,因为设计意味着也就是说,它应该是类的不变量(我们称它为managed),然后shared_from_this是脆弱和不足的,你应该提供一个工厂函数来制作对象(make_managed)并且不允许构造由new 或自动或静态对象或成员。

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


【解决方案1】:

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

这并没有什么问题,唯一的问题是你可能没有在 Y 类的成员中拥有它,有时你希望成员返回 std::shared_ptr 给它自己。 std::shared_ptr&lt;Y&gt;( this ) 显然是一种错误的创建方式。

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

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

【讨论】:

  • 感谢 Slavik,这正是我要问的!这次你能感觉到我;)
【解决方案2】:

shared_from_this 的目的是让您在已经可以访问shared_ptr 时获得shared_ptr。在您的示例中毫无意义,因为您的示例过于简化。想象一下,有一些函数只能获得Y*Y&amp;,它需要与某人共享所有权。 Y成员经常发生这种情况,因为成员只能访问 this

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    相关资源
    最近更新 更多