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

标签 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 
}

提前感谢您分享知识。

最佳答案

这里没有出现循环依赖,因为 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 的正确引用,代码按预期工作(假设此行为是预期行为)。

关于c++ - 两个类的前向声明会导致构造函数中的循环依赖吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51777313/

相关文章:

c++ - 我应该在C++项目文件结构中的哪里放置用户定义的概念?

c++ - C++中两种类型的矩阵输出

c++ - 在 sqlite 中将 char* 作为 vector<byte> 插入

java - 调用构造函数后何时创建对象

java - ClassLoader.defineClass 抛出的 ClassCircularityError

angular - Angular 4 中的循环依赖

c++ - 如何从派生类访问基类中的 protected 方法?

c++ - C++调用抽象基类的构造函数

c++ - 为什么我可以将 boost map_list_of 传递给接受映射而不是构造函数的函数?

node.js - 当条件时 Joi 循环依赖错误