所以我的最新错误开始让我感到非常糟糕,我已经浏览了互联网,我提出的最佳解决方案是我有一个周期性#include
错误,但我不确定究竟是什么导致了这一点。我的include结构如下所示:
Player.h -includes-> Pawn.h -includes-> Piece.h -includes-> Player.h
我的意思是,我觉得这是一个周期性的包含问题,但我不知道如何克服这个问题。更复杂的是,课程Pawn
延伸Piece
,Piece
boost::weak_ptr
返回Player
。我的包含这样的原因是因为Player
有vector
Pawn
s(以及其他Piece
s)但Pawn
也需要调用其中一些Player
的方法,因此我将weak_ptr
基类给了Player
。
我可以更好地设计这种方式,以便我没有周期性的包含?
答案 0 :(得分:3)
您可以使用前向声明解决此问题;实际上,在大多数情况下,你应该更喜欢它们包括标题。
当标题不需要知道另一个类的任何实现细节时,可以使用前向声明,而不是包括整个类定义。这基本上告诉编译器“有一个具有此名称的类”,但没有别的。
// This is a forward declaration. It tells the compiler that there is a
// class named Player, but it doesn't know the size of Player or what functions
// it has.
class Player;
struct Piece {
// This is just a pointer to player. It doesn't need to know any details about
// Player, it just needs to know that Player is a valid type.
boost::weak_ptr<Player> player;
};
作为一般规则,如果文件仅传递指针或对特定类型的引用,则应该向前声明该类型。但是,如果它尝试实际使用该类型的对象,则会导致编译器错误。在这种情况下,您需要包含适当的标头。
在大多数情况下,您需要在源文件中包含任何前向声明的类的标头,这样您就可以实际使用指向的对象。
答案 1 :(得分:1)
在所有标头文件中使用Header Guards,如下所示:
#ifndef PLAYER_H
#define PLAYER_H
//contents of your header file go here
#endif
答案 2 :(得分:0)
move包括(如果可能)到.cpp文件。 如果你还有循环,那么将最常见的东西提取到一个单独的文件中。 在你的情况下,Player.h包含Player.h似乎有问题(只是在这里猜测)。