构造函数中的循环指针注入
C++ Cyclic pointer injection in constructor
我读过很多循环依赖的主题,但我找不到一个解决我的问题。我有两个类,其中包含指向彼此的指针:
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:正如评论中所述,如果你有很多类,这是不可扩展的。然而,在一般情况下,你必须在构造函数的之外初始化循环依赖,其次,你不应该有很多循环依赖于彼此的类(如果是这种情况,也许你可以重新安排你的代码…)。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- 作为指针注入类后重新创建堆栈对象不好吗?
- 读取进程内存多级指针(DLL 注入)
- 是否使用指针将uint16_t值注入uint8_t数组
- 从注入进程的 DLL 调用函数并更改指针函数的地址
- 使用注入的 dll 使用内存指针编辑值
- 智能指针的依赖关系注入是否违反单一责任原则
- 构造函数中的循环指针注入