可以吗?我正在尝试确定构造函数中是否存在循环依赖的风险。
头文件:
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
}
预先感谢您分享知识。
答案 0 :(得分:1)
此处没有循环依赖项,因为B
不包含类型为A
的实际对象,而仅包含引用。这样,*A::cObj
在构造时具有明确定义的大小,并且不依赖于A
的实现细节(如果B
包含实际的A
而不是引用,会产生循环依赖关系,创建A
所需的内存将是无限的。
让我们看一个小例子(我公开aObjLocal
只是为了能够打印地址)
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
的正确引用,该代码按预期工作(假定此行为是预期的)。