循环依赖如何在C ++中出现?

时间:2016-02-28 05:56:28

标签: c++ circular-dependency

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

我想知道它们是如何用C ++实现的?

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

1 个答案:

答案 0 :(得分:1)

<强> 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"

循环依赖的原因是当一个类在其自己的头文件中包含另一个类的头文件时,另一个类也包括前一个头文件。如果涉及多个类可能不明显但是通过一系列包含来完成,例如:

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

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