c++中依赖类的生命周期

Lifetime of dependent classses in C++?

本文关键字:生命 周期 依赖 c++      更新时间:2023-10-16

我有一个类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的智能指针的引用,而不是在construct_B中动态分配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是否避免了AB之前被删除的问题?

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
}