C++中循环依赖是如何产生的?

How do circular dependencies occur in C++?

我一直在阅读设计模式 (GOF),其中提到 Facade 模式消除了循环依赖。

我想知道它们在 C++ 中是如何出现的?

PS: 我不是在问如何解决它们。

ClassA.h

#ifndef CLASS_A_H
#define CLASS_A_H

#include "ClassB.h" // Contributes To Circular Include

class ClassA {
private:
    ClassB* m_pB;

public:
    explicit ClassA( ClassB* pB );

}; // ClassA

#endif // CLASS_A_H

ClassA.cpp

#include "ClassA.h"

ClassB.h

#ifndef CLASS_B_H
#define CLASS_B_H

#include "ClassA.h" // Contributes To Circular Include

class ClassB {
public:
    ClassB();

    void updateA( ClassA* pA );

}; // ClassB

#endif // CLASS_B_H

ClassB.cpp

#include "ClassB.h"

导致循环依赖的原因是当一个 class 在其自己的 header 文件中包含另一个 class 的 header 文件时,另一个 class还包括之前的 header 文件。如果涉及多个 classes 时也可能发生这种情况,虽然它可能不明显但通过一系列包含完成,例如:

A.h includes B.h : B.h includes C.h : C.h includes D.h : D.h includes A.h 这仍然会造成循环依赖。

这就是为什么建议在依赖它们的 class 的 header 文件中包含 class 原型或前向声明;然后在需要这些依赖项的 class 的 cpp 文件中包含那些依赖项 headers。可能有几种情况你无法避免这种情况,并且包含的​​ header 必须在 class 的 header 内,所以这就是为什么需要注意的原因好的程序设计。