我正在尝试使用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;
}
然而,这不能正常工作,有任何建议我如何正确地将其作为参数传递?
答案 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();