gpt4 book ai didi

C++ 构造函数中的循环指针注入(inject)

转载 作者:行者123 更新时间:2023-11-30 04:19:47 27 4
gpt4 key购买 nike

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

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

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

最佳答案

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

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)

编辑:如评论中所述,如果您有很多类,这将无法扩展。然而,在一般情况下,你将不得不在构造函数的外部初始化循环依赖,其次你不应该有很多循环依赖彼此的类(如果是这样,也许你可以重新排列您的代码...)。

关于C++ 构造函数中的循环指针注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15598490/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com