11

我正在尝试使用 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;
}

但是,这不能正常工作,有什么建议我可以正确地将其作为参数传递吗?

4

1 回答 1

13

我想你可能想要的是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() );
}

更新以包含来自 David Rodriguez 的评论

请注意,永远shared_from_this()不应在尚未由. 这是有效的:shared_ptr

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

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

A a;
a.createB();
于 2012-05-10T12:44:04.910 回答