加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – enable_shared_from_this Vs Direct Assignment

发布时间:2020-12-16 10:03:25 所属栏目:百科 来源:网络整理
导读:我为什么要使用enable_shared_from_this,因为我也可以通过普通赋值获得相同的效果. struct A : std::enable_shared_from_thisA {std::shared_ptrA getptr() { return shared_from_this(); } };int main () {// What is the differentce between this code st
我为什么要使用enable_shared_from_this,因为我也可以通过普通赋值获得相同的效果.

struct A : std::enable_shared_from_this<A> {
std::shared_ptr<A> getptr() {
    return shared_from_this();
 } 
};


int main () {
// What is the differentce between this code
 std::shared_ptr<A> p1 = make_shared<A>();
 std::shared_ptr<A> p2 = p1->getptr();

// Vs this

 std::shared_ptr<A> p1 = make_shared<A>();
 std::shared_ptr<A> p2 = p1;
}

解决方法

因为你不能得到“相同”的效果“,至少不是你可能想到的那个.

发布的代码方法没有区别,正是因为A继承自std :: enable_shared_from_this< A>. p1和p2都是shared_ptr对象,引用相同的具体对象(假设只为您的测试编译了其中一个部分,否则您在id名称重用时出错).

的std :: enable_shared_from_this< T>允许您获取std :: shared_ptr< T>来自某个对象,由一些预先存在的std :: shared_ptr< T>正式管理.类型T或其衍生物,在没有std :: shared_ptr< T>的地方.对于以其他方式获得的对象,但由于某种原因需要一个.例如:

#include <iostream>
#include <memory>

struct A;

void foo(std::shared_ptr<A> arg)
{
}

struct A : std::enable_shared_from_this<A>
{
    void method()
    {
        foo(shared_from_this());
    }
};


int main ()
{
    auto a = std::make_shared<A>();
    a->method();
}

在上面的例子中,foo需要std :: shared_ptr< A>作为参数.从A :: method()的主体开始,如果没有std :: enable_shared_from_this< A>,则不存在这样的机制.作为基础.没有std :: enabled_shared_from_this< T> base,你必须提供一种替代机制,用于将共享指针传递到调用链,直到它到达foo.简而言之,它看起来像这样:

#include <iostream>
#include <memory>

struct A;

void foo(std::shared_ptr<A> arg)
{
}

struct A
{
    void method(std::shared_ptr<A> me)
    {
        foo(me);
    }
};


int main ()
{
    std::shared_ptr<A> a = std::make_shared<A>();
    a->method(a);
}

这显然是可怕和可怕的.此外,不能保证我的方法实际上是std :: shared_ptr< T>这个的.因此,标准委员会用std :: enable_shared_from_this< T>祝福我们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读