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

Lifetime of dependent classses in C++?

我有一个 class A,它提供了构造 class 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 的所有可能性,而不是 returning 原始指针我可以 return 智能指针或类似指针。

解决这个问题的一种可能方法是使用 B 而不是持有指向 A 的智能指针的引用,而不是在 [=16] 中动态分配 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) { }
}

然后可以通过 诠释主要(){ A static_A; Bstatic_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

}