c++循环构造依赖:类的构造函数都有指向彼此的指针

C++ circular construction dependency: class constructors taking a pointer to each other

本文关键字:指针 构造函数 依赖 c++ 循环      更新时间:2023-10-16

我有以下类

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) {}
};

现在我想创建两个相互引用的对象有没有办法做到这一点?我认为用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);

先创建一个对象。然后是另一个。设置任何尚未设置的指针。就是这样。请注意,当不再有外部引用时,这些循环引用的对象不会自动释放:循环依赖需要非常显式地打破。


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

很容易看出,如上所述的问题没有解决方案,因为您一次只能创建一个类实例。