C 11将’this’作为std :: make_shared的参数输入

前端之家收集整理的这篇文章主要介绍了C 11将’this’作为std :: make_shared的参数输入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用std :: make_shared将’this’传递给构造函数

例:

// headers
class A 
{
public:
   std::shared_ptr<B> createB();
}


class B 
{
private:
   std::shared_ptr<A> a;

public:
   B(std::shared_ptr<A>);
}


// source
std::shared_ptr<B> A::createB()
{
   auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta)
   auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error,but doenst work
   return b;
}

然而,这不能正常工作,任何建议我如何正确传递这个作为参数?

解决方法

我想你在这里想要的是 shared_from_this.
// headers
class A : std::enable_shared_from_this< A >
{
public:
   std::shared_ptr<B> createB();
}


class B 
{
private:
   std::shared_ptr<A> a;

public:
   B(std::shared_ptr<A>);
}


// source
std::shared_ptr<B> A::createB()
{
   return std::make_shared<B>( shared_from_this() );
}

更新包括comments from David Rodriguez

请注意,永远不应在尚未由shared_ptr管理的对象上调用shared_from_this().这是有效的:

shared_ptr<A> a( new A );
a->createB();

虽然以下导致未定义的行为(尝试在a上调用delete):

A a;
a.createB();
原文链接:https://www.f2er.com/c/119462.html

猜你在找的C&C++相关文章