关于循环依赖& #includes在C ++中

时间:2017-09-08 13:21:27

标签: c++ include circular-dependency

在类的头文件中使用#include时,我在这里读了几个关于循环依赖的问题,例如: //抱歉编辑了清楚的例子

File Car.h

#include "Wheel.h"
#include <vector>

class Car
{
    std::vector<Wheel> wheels;
};

File Wheel.h

#include "Car.h"
class Wheel
{
    Car* car;
};

由于两个类之间发生循环依赖性而发生编译错误。我的问题是,如果我在类Car的.cpp中使用#include "Wheel.h"或在Wheel类的.cpp中使用#include "Car.h",问题就解决了。它不是循环依赖吗?

1 个答案:

答案 0 :(得分:0)

//A.h
#include "B.h"
class A
{}

//////////////

//B.h
#include "A.h"
class B
{}

显示的代码中没有循环依赖关系。两个课程都不依赖于另一个课程。 (但由于语法错误,代码无法编译。)

循环包括简单地表示尽管已经包含在顶部,但是一个标题不在另一个标题之前。这只是因为两者不能同时在另一个之前。如果首先包含的标题中定义的类取决于第二个包含的类,则会出现错误。

更新新示例:

在这种情况下,Car取决于Wheel的定义,Wheel取决于Car的声明。请注意,Wheel不依赖于Car的定义。它不需要知道什么类Car,只是它是一个类。

  

我的问题是为什么如果我在类Car的.cpp中使用#include“Wheel.h”或者在类Wheel的.cpp中使用#include“Car.h”,问题就解决了。

这不正确,这不能解决问题。它可能会使问题消失,但程序仍然会出错。

正确的解决方案是在定义Wheel之前包含Car的定义,并在定义Car之前声明Wheel。像这样:

class Car;

class Wheel
{
    Car* car;
};

class Car
{
    std::vector<Wheel> wheels;
};