1

我已经阅读了很多循环依赖主题,但我找不到解决我问题的主题。我有两个包含彼此指针的类:

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 并在创建对象后调用它们,因此指针将是有效的。但是,我希望在调用构造函数后对象是完整的,而不调用任何其他方法。

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

4

1 回答 1

2

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

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)

编辑:如评论中所述,如果您有很多课程,这是不可扩展的。但是,在一般情况下,您必须在构造函数之外初始化循环依赖项,其次,您不应该有很多循环依赖于彼此的类(如果是这种情况,也许您可​​以重新排列代码...... )。

于 2013-03-24T12:36:37.110 回答