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