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

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