两个类的前向声明会在构造函数中导致循环依赖吗?

时间:2018-08-10 00:15:25

标签: c++ constructor circular-dependency forward-declaration

可以吗?我正在尝试确定构造函数中是否存在循环依赖的风险。

头文件:

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 
}

预先感谢您分享知识。

1 个答案:

答案 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的正确引用,该代码按预期工作(假定此行为是预期的)。