#include和可能的周期性参考

时间:2011-11-24 06:19:32

标签: c++ include cycle

所以我的最新错误开始让我感到非常糟糕,我已经浏览了互联网,我提出的最佳解决方案是我有一个周期性#include错误,但我不确定究竟是什么导致了这一点。我的include结构如下所示:

Player.h -includes-> Pawn.h -includes-> Piece.h -includes-> Player.h

我的意思是,我觉得这是一个周期性的包含问题,但我不知道如何克服这个问题。更复杂的是,课程Pawn延伸PiecePiece boost::weak_ptr返回Player。我的包含这样的原因是因为Playervector Pawn s(以及其他Piece s)但Pawn也需要调用其中一些Player的方法,因此我将weak_ptr基类给了Player

我可以更好地设计这种方式,以便我没有周期性的包含?

3 个答案:

答案 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似乎有问题(只是在这里猜测)。