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 内,所以这就是为什么需要注意的原因好的程序设计。
我一直在阅读设计模式 (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 内,所以这就是为什么需要注意的原因好的程序设计。