C 11将’this’作为std :: make_shared的参数输入

前端之家收集整理的这篇文章主要介绍了C 11将’this’作为std :: make_shared的参数输入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试使用std :: make_shared将’this’传递给构造函数

例:

  1. // headers
  2. class A
  3. {
  4. public:
  5. std::shared_ptr<B> createB();
  6. }
  7.  
  8.  
  9. class B
  10. {
  11. private:
  12. std::shared_ptr<A> a;
  13.  
  14. public:
  15. B(std::shared_ptr<A>);
  16. }
  17.  
  18.  
  19. // source
  20. std::shared_ptr<B> A::createB()
  21. {
  22. auto b = std::make_shared<B>(this); // Compiler error (VS11 Beta)
  23. auto b = std::make_shared<B>(std::shared_ptr<A>(this)); // No compiler error,but doenst work
  24. return b;
  25. }

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

解决方法

我想你在这里想要的是 shared_from_this.
  1. // headers
  2. class A : std::enable_shared_from_this< A >
  3. {
  4. public:
  5. std::shared_ptr<B> createB();
  6. }
  7.  
  8.  
  9. class B
  10. {
  11. private:
  12. std::shared_ptr<A> a;
  13.  
  14. public:
  15. B(std::shared_ptr<A>);
  16. }
  17.  
  18.  
  19. // source
  20. std::shared_ptr<B> A::createB()
  21. {
  22. return std::make_shared<B>( shared_from_this() );
  23. }

更新包括comments from David Rodriguez

请注意,永远不应在尚未由shared_ptr管理的对象上调用shared_from_this().这是有效的:

  1. shared_ptr<A> a( new A );
  2. a->createB();

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

  1. A a;
  2. a.createB();

猜你在找的C&C++相关文章