可以吗?我正在尝试确定构造函数中是否存在循环依赖的风险。
头文件:
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
而不是引用,则将发生循环依赖关系,创建an所需的内存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
,代码按预期工作(假设此行为是预期的)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句