C++ 如何防止连续循环#include语句?

C++ 如何防止连续循环#include语句?,c++,visual-c++,C++,Visual C++,我有两个类的问题,每个类都需要在头文件中了解另一个类 结构.h Bullet.cpp 因为这两个头文件互相调用,所以我得到了很多错误。我厌倦了更换 #include "Bullet.h" 在结构中 class Bullet; 但是编译器说我有多重定义的类型。你应该如何绕过循环的include语句呢?问题是你把标题包含在彼此之间。也就是说,您在bullet中包含结构,反之亦然,这会导致多重包含错误。顶部的包含保护可以防止这种情况发生,但我仍然发现在某些情况下会发生这种情况,这就是其中之一。问题

我有两个类的问题,每个类都需要在头文件中了解另一个类

结构.h Bullet.cpp 因为这两个头文件互相调用,所以我得到了很多错误。我厌倦了更换

#include "Bullet.h"
在结构中

class Bullet;

但是编译器说我有多重定义的类型。你应该如何绕过循环的include语句呢?

问题是你把标题包含在彼此之间。也就是说,您在bullet中包含结构,反之亦然,这会导致多重包含错误。顶部的包含保护可以防止这种情况发生,但我仍然发现在某些情况下会发生这种情况,这就是其中之一。

问题在于您将标题包含在彼此之间。也就是说,您在bullet中包含结构,反之亦然,这会导致多重包含错误。顶部的包含保护可以防止这种情况,但我仍然发现在某些情况下会发生这种情况,这就是其中之一。

首先,您要避免那些循环包含。然后,如果真的没有出路,只需在标头中声明所需的类

例如,在Bullet.h中:

#include "Sprite.h"

class Structure; // Can now use Structure* and Structure&
class Bullet {
...
}
在Bullet.cpp中

#include "Bullet.h"
#include "Structure.h"
在结构中。h:

#include "Sprite.h"

class Bullet;   // Can now use Bullet* and Bullet&
class Structure {
...
}
In Structure.cpp

#include "Structure.h"
#include "Bullet.h"

当编译器在Bullet实现中看到未知的“Sprite”对象时,他会知道您引用的是特定的对象,因为您在头中声明了。请参阅中的示例。

首先,您希望避免那些循环包含。然后,如果真的没有出路,只需在标头中声明所需的类

例如,在Bullet.h中:

#include "Sprite.h"

class Structure; // Can now use Structure* and Structure&
class Bullet {
...
}
在Bullet.cpp中

#include "Bullet.h"
#include "Structure.h"
在结构中。h:

#include "Sprite.h"

class Bullet;   // Can now use Bullet* and Bullet&
class Structure {
...
}
In Structure.cpp

#include "Structure.h"
#include "Bullet.h"

当编译器在Bullet实现中看到未知的“Sprite”对象时,他会知道您引用的是特定的对象,因为您在头中声明了。例如,请参见中的。

在头文件中,如果除了指向该类(成员和/或参数/返回类型)的指针之外没有其他指针,则可以使用转发声明,而不包括头文件:

class Bullet;

您仍然需要在cpp文件中同时包含Structure.h和Bullet.h,因为这两个文件都需要完整的定义。

在头文件中,如果您除了指向该类(成员和/或参数/返回类型)的指针之外没有其他对象,则可以使用前向声明,而不包括头文件:

class Bullet;

您仍然需要在cpp文件中同时包含Structure.h和Bullet.h,因为这两个文件都需要完整的定义。

使用指向类的指针,而不是其中一个文件中的类,并通过
new
(和
删除
在dtor,ofc中)分配它


问题是,编译器总是知道指针的大小,所以它不会抱怨并编译代码。这称为向前声明。它有很好的文档记录。

使用指向类的指针,而不是其中一个文件中的类,并通过
new
(以及
delete
在dtor、ofc中)分配它

问题是,编译器总是知道指针的大小,所以它不会抱怨并编译代码。这称为向前声明。它有很好的文档记录。

添加一次#pragma会有所帮助,但是有一个更好的include结构来避免循环也会很好

#pragma once确保当前文件在一次编译中只包含一次,有关#pragma once的详细信息,请访问

添加一次#pragma将有所帮助,但是有一个更好的include结构来避免循环也会很好

#pragma once确保当前文件在一次编译中只包含一次,有关#pragma once的详细信息,请访问

只要您还包括
Structure.cpp
中的
Bullet.h
,您所做的应该是有效的。编译器错误到底是什么?不幸的是:
std::vector
的可能重复是一种效率低下的专门化(它针对空间进行了优化)。如果速度很关键,您可能想尝试
std::vector
,但不要忘记测试它是否有影响。您所做的应该是有效的,只要您还包括
Structure.cpp
中的
Bullet.h
。编译器错误到底是什么?不幸的是:
std::vector
的可能重复是一种效率低下的专门化(它针对空间进行了优化)。如果速度很关键,您可能想尝试
std::vector
,但别忘了测试它是否有影响。总有办法的。因为C++中不能有循环依赖性,所以在所有的情况下都不一定要避免。如果<代码> B.H.<代码>需要<代码> A.H./COD>,而<代码> C.H./Cuth>需要在 A.H.<代码>和<代码> B.H.<代码>,<代码> C.H.<代码>应<代码>包含< /代码>两个头。如果有人出现并删除了
b.h
a.h
的依赖,你不会希望
c.h
崩溃。总有办法的。因为C++中不能有循环依赖性,所以在所有的情况下都不一定要避免。如果<代码> B.H.<代码>需要<代码> A.H./COD>,而<代码> C.H./Cuth>需要在 A.H.<代码>和<代码> B.H.<代码>,<代码> C.H.<代码>应<代码>包含< /代码>两个头。如果有人出现并删除了
b.h
a.h
的依赖,您不会希望
c.h
崩溃。