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
是否避免了A
在B
之前被删除的问题?
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
}
我有一个 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
是否避免了A
在B
之前被删除的问题?
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
}