c++ - 循环依赖在 C++ 中是如何发生的?

标签 c++ circular-dependency

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

我想知道它们是如何在 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

A 类.cpp
#include "ClassA.h"

B类.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

B类.cpp
#include "ClassB.h"

导致循环依赖的原因是一个类在其自己的头文件中包含另一个类的头文件,而另一个类也包含前一个头文件。如果涉及多个类,但可能不明显但通过包含链完成,也会发生这种情况,例如:
A.h includes B.h : B.h includes C.h : C.h includes D.h : D.h includes A.h这仍然会创建循环依赖。

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

关于c++ - 循环依赖在 C++ 中是如何发生的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35679278/

相关文章:

c++ - C++ 中结构引用的默认参数

c++ - 在 GetMessage 循环中未接收到 WM_COMMAND

c++ - 用随机数填充多个 vector

f# - F# 是否支持单独文件中的相互依赖的类?

具有双重分派(dispatch)的 C++ 多态循环依赖

maven - Gradle/Maven 循环依赖的行为

c++ - 国外OS英文C++程序

c++ - Qt 5编码问题

machine-learning - 机器学习算法中的循环数据

c# - 如何解决 Autofac 循环依赖?