C ++ 11将'this'作为std :: make_shared的参数传递

时间:2012-05-10 12:40:29

标签: c++ constructor c++11 this 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;
}

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

1 个答案:

答案 0 :(得分:14)

我认为你在这里想要的是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_from_this()应该从不调用尚未由shared_ptr管理的对象。这是有效的:

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

以下情况会导致未定义的行为(尝试在delete上致电a):

A a;
a.createB();