我有一个类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
的问题?
答案 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
}