C++循环构造依赖:类构造函数相互指向

ecl*_*pse 0 c++ pointers smart-pointers circular-dependency

我有以下课程

class a {
        std::shared_ptr<b> b_ref;
    public:
        a(std::shared_ptr<b> b_ref) : b_ref(b_ref) {}
};

class b {
        std::shared_ptr<a> a_ref;
    public:
        b(std::shared_ptr<a> a_ref) : a_ref(a_ref) {}
};
Run Code Online (Sandbox Code Playgroud)

现在我想创建两个相互引用的对象有没有办法做到这一点?我认为使用c风格的指针我可以做到这一点.它也适用于共享指针吗?我尝试了reset()和swap()方法没有任何成功.

std::shared_ptr<a> a_ref;
std::shared_ptr<b> b_ref;

a_ref = std::make_shared<a>(b_ref);
b_ref = std::make_shared<b>(a_ref);
Run Code Online (Sandbox Code Playgroud)

不工作.

Che*_*Alf 9

首先创建一个对象.然后是另一个.设置任何尚未设置的指针.而已.请注意,当没有更多外部引用时,这些循环引用对象将不会自动释放:需要非常明确地断开循环依赖性.


在存在循环依赖关系的情况下,直接使用智能指针通常不是最佳解决方案.请考虑其他设计.