避免头文件的循环依赖

Bun*_*ori 51 c++ architecture software-design

关于如何避免头文件的循环依赖,你有什么好建议吗?

当然,从一开始,我就尝试尽可能透明地设计项目.但是,随着越来越多的功能和类的添加,以及项目变得不那么透明,循环依赖开始发生.

是否有任何通用,经过验证和工作的规则?谢谢.

Art*_*yom 50

如果你有循环依赖,那么你做错了.

例如:

foo.h
-----
class foo {
public:
   bar b;
};

bar.h
-----
class bar {
public:
   foo f;
};
Run Code Online (Sandbox Code Playgroud)

你可能想要非法的:

foo.h
-----
class bar; // forward declaration
class foo {
   ...
   bar *b;
   ...
};

bar.h
-----
class foo; // forward declaration
class bar {
   ...
   foo *f;
   ...
};
Run Code Online (Sandbox Code Playgroud)

这没关系.

通用规则:

  1. 确保每个标题都可以单独包含在内.
  2. 如果你可以使用前向声明使用它们!


jon*_*son 16

  • 尽可能使用前向声明.
  • 如果只有cpp文件需要,则将任何标头包含在头文件中并移入相应的cpp文件中.执行这种最简单的方法是使#include "myclass.h"第一包括myclass.cpp.
  • 在不同类之间的交互点引入接口可以帮助减少依赖性.


Sul*_*lla 7

为了避免循环依赖,我遵循的一些最佳实践是,

  1. 坚持OOAD原则.除非包含的类与当前类具有组合关系,否则不要包含头文件.请改用前向声明.
  2. 设计抽象类以充当两个类的接口.通过该接口进行类的交互.


Ed *_*ess 6

一般方法是将共性分解为第三个头文件,然后由两个原始头文件引用.

另请参阅循环依赖性最佳实践