构造函数中的循环指针注入

C++ Cyclic pointer injection in constructor

本文关键字:指针 注入 循环 构造函数      更新时间:2023-10-16

我读过很多循环依赖的主题,但我找不到一个解决我的问题。我有两个类,其中包含指向彼此的指针:

class B;
class A
{
public:
    A(B* _b, int _c): b(_b), c(_c) {}
    B* b;
    int c;
};
class B
{
public:
    B(A* _a, int _d): a(_a), d(_d) {}
    A* a;
    int d;
};

问题在于下面的代码:

class C
{ 
public:
    A* a_ptr;
    B* b_ptr;
    C() 
    {
        a_ptr = new A(b_ptr, 3);
        b_ptr = new B(a_ptr, 2);
        qDebug() << a_ptr->c;
        qDebug() << b_ptr->d;
        qDebug() << a_ptr->b->d;
        qDebug() << b_ptr->a->c;
    }
}

最后两行导致应用程序崩溃。我理解这个问题和崩溃的原因。我可以为成员编写setter并在创建对象后调用它们,因此指针将是有效的。但是,我希望对象在调用构造函数之后完成,而不调用任何其他方法。

所以…我想知道是否有任何方法注入(循环)指针在构造函数?

可以让一个构造函数完成另一个对象的初始化:

B(A* a_ptr) : a(a_ptr)
{
    if(a)
        a->b = this;
}

对于A()也是一样。因此,您可以像下面这样创建它们:

a_ptr = new A(b_ptr, 3); // b_ptr was initialized to 0
b_ptr = new B(a_ptr, 2); // b_ptr->a = a_ptr
                         // b_ptr->a->b = b_ptr (ie, a_ptr->b = b_ptr)

Edit:正如评论中所述,如果你有很多类,这是不可扩展的。然而,在一般情况下,你必须在构造函数的之外初始化循环依赖,其次,你不应该有很多循环依赖于彼此的类(如果是这种情况,也许你可以重新安排你的代码…)。