c – enable_shared_from_this Vs Direct Assignment
我为什么要使用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>祝福我们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |