【发布时间】:2016-09-15 14:12:43
【问题描述】:
我有一个类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 以获取对@987654335 的静态引用@ 然后设置它的指针,类似于
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; B静态_B; A.setup_B(静态_B); }
最后这个构造的shared_ptr是否避免了A在B之前被删除的问题?
【问题讨论】:
-
您为什么不尝试一下并制作一些控制台输出?但是这里只有当没有人指向A时才会删除A。
-
"最后这个构造的shared_ptr是否避免了A在B之前被删除的问题?是的。唯一需要注意的是,A 本身必须由 shared_ptr 拥有,否则 shared_from_this() 将是 UB。
标签: c++ pointers circular-dependency object-lifetime