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