C ++中依赖类的生命周期?

时间:2016-09-15 14:12:44

标签: c++ pointers circular-dependency object-lifetime

我有一个类A,它提供了构造类B实例的方法。 B拥有对A的私有引用,并提供了一个构造函数来设置此引用。

class A { 
   public: 
     B* construct_B ();
}
class B {
  private:
    const A& private_A;
  public:
    B ( const A& my_A ): private_A (my_A) { }
}

construct_B的实现负责动态分配并通过this将引用传递给自己。

如何实现此设置,以确保A的生命周期长于B,以使其引用保持有效?请注意,我并不关心construct_B的所有可能性,而不是返回原始指针,我可以返回智能指针或类似指针。

解决这个问题的一种可能方法可能是B而不是保留一个引用来保存指向A的智能指针,而不是在B中动态分配construct_B获取B的静态引用,然后设置它的指针,如

class A : 
   public std::enable_shared_from_this<A> { 
   public: 
      void setup_B ( const B& my_B ) { 
        my_B.set_A (shared_ptr_from_this() ) ;
}
class B {
  private:
    const shared_ptr<A> private_A_ptr;
  public:
    void set_A ( const shared_ptr<A> my_A ): 
        private_A_ptr (my_A) { }
}

然后可以实现     int main(){       一个static_A;       B static_B;       A.setup_B(static_B);     }

最后一个结构的shared_ptr是否可以避免在A之前删除B的问题?

1 个答案:

答案 0 :(得分:2)

shared_ptr是你的答案。像这样:

#include <memory>

struct A;

class B {
    const std::shared_ptr<A> private_A_ptr;
  public:
  B(std::shared_ptr<A> parent) : private_A_ptr(std::move(parent)) {}
};

struct A : 
std::enable_shared_from_this<A> 
{ 
  B make_b() {
    return B(shared_from_this());
  }
};

int main()
{
  // this would be invalid:  
  //A a;
  //auto b = a.make_b();

  // but this is fine

  auto pa = std::make_shared<A>();
  auto b = pa->make_b();

  // later...
  pa.reset();

  // A still exists because ownership was shared with b

}