两个 类 的前向声明会导致构造函数中的循环依赖吗?
Will forward-declaration of two classes lead to circular dependency in the constructor?
这是允许的吗?我试图确定构造函数中是否存在循环依赖的风险。
头文件:
class B; //forward declaration
class A
{
public:
std::unique_ptr<B> cObj;
std::vector<B*> cList;
A();
};
class B
{
public:
B(A& aObj) : aObjLocal(aObj) {};
void ShareData(int result);
private:
A& aObjLocal;
};
Cpp 文件:
void B::ShareData(int result)
{
for (auto& iterator : aObjLocal.cList)
{
(*iterator).ShareData(result);
}
}
A::A()
{
cObj = std::make_unique<B>(*this); // <- Will this cause circular dependecy
}
提前感谢您分享知识。
这里没有出现循环依赖,因为 B
不包含 A
类型的实际对象,而只包含一个引用。这样,*A::cObj
在构造时具有明确定义的大小,并且不依赖于 A
的实现细节(如果 B
包含实际的 A
而不是引用,会发生循环依赖,创建 A
所需的内存将是无限的)。
让我们看一个小例子(我做了 aObjLocal
public 只是为了能够打印地址):
int main(){
A a;
std::cout << "Address of a: " << &a << std::endl;
std::cout << "Address of aObjLocal of a.cObj: " << &((*(a.cObj)).aObjLocal) << std::endl;
}
输出看起来像这样
Address of a: 0x7ffe68b95f70
Address of aObjLocal of a.cObj: 0x7ffe68b95f70
因此 a.cObj
确实包含对 a
的正确引用,代码按预期工作(假设此行为是预期行为)。
这是允许的吗?我试图确定构造函数中是否存在循环依赖的风险。
头文件:
class B; //forward declaration
class A
{
public:
std::unique_ptr<B> cObj;
std::vector<B*> cList;
A();
};
class B
{
public:
B(A& aObj) : aObjLocal(aObj) {};
void ShareData(int result);
private:
A& aObjLocal;
};
Cpp 文件:
void B::ShareData(int result)
{
for (auto& iterator : aObjLocal.cList)
{
(*iterator).ShareData(result);
}
}
A::A()
{
cObj = std::make_unique<B>(*this); // <- Will this cause circular dependecy
}
提前感谢您分享知识。
这里没有出现循环依赖,因为 B
不包含 A
类型的实际对象,而只包含一个引用。这样,*A::cObj
在构造时具有明确定义的大小,并且不依赖于 A
的实现细节(如果 B
包含实际的 A
而不是引用,会发生循环依赖,创建 A
所需的内存将是无限的)。
让我们看一个小例子(我做了 aObjLocal
public 只是为了能够打印地址):
int main(){
A a;
std::cout << "Address of a: " << &a << std::endl;
std::cout << "Address of aObjLocal of a.cObj: " << &((*(a.cObj)).aObjLocal) << std::endl;
}
输出看起来像这样
Address of a: 0x7ffe68b95f70
Address of aObjLocal of a.cObj: 0x7ffe68b95f70
因此 a.cObj
确实包含对 a
的正确引用,代码按预期工作(假设此行为是预期行为)。