C++ 多个文件中的多个包含

C++ 多个文件中的多个包含,c++,header,c-preprocessor,include-guards,C++,Header,C Preprocessor,Include Guards,我正在做一个小游戏 在战斗记录中,h: #ifndef _CHARACTER_H_ #define _CHARACTER_H_ #include "Character.h" #endif class BattleRecord { public: Character Attacker; Character Defender; Status status; int DamageDealt; int GoldEarned; int ExpGai

我正在做一个小游戏

在战斗记录中,h:

#ifndef _CHARACTER_H_
#define _CHARACTER_H_
#include "Character.h"
#endif

class BattleRecord
{
public:
    Character Attacker;
    Character Defender;
    Status status;
    int DamageDealt;    
    int GoldEarned;
    int ExpGained;
};
#ifndef _CHARACTER_H_
#define _CHARACTEr_H_
#include "Character.h"
#endif

#ifndef _BATLE_RECORD_H_
#define _BATLE_RECORD_H_
#include "BattleRecord.h"
#endif

class GUI
{
public:
//GUI Methods, and two of these:
void ViewStats(Character &Player);
void Report(BattleRecord Record)
}
在字符中,h:

#ifndef _EQUIPMENT_H_
#define _EQUIPMENT_H_
#include "Equipment.h"
#endif

class BattleRecord;
class Character
{
BattleRecord AttackEnemy(Character &Enemy);
}
在战斗记录中,h:

#ifndef _CHARACTER_H_
#define _CHARACTER_H_
#include "Character.h"
#endif

class BattleRecord
{
public:
    Character Attacker;
    Character Defender;
    Status status;
    int DamageDealt;    
    int GoldEarned;
    int ExpGained;
};
#ifndef _CHARACTER_H_
#define _CHARACTEr_H_
#include "Character.h"
#endif

#ifndef _BATLE_RECORD_H_
#define _BATLE_RECORD_H_
#include "BattleRecord.h"
#endif

class GUI
{
public:
//GUI Methods, and two of these:
void ViewStats(Character &Player);
void Report(BattleRecord Record)
}
这里的问题是,我的角色.h和战绩.h需要相互包含,这肯定会导致多重重新定义问题。因此,我在Character.h中使用了转发声明,添加了:

class BattleRecord;
问题解决了。但是,GUI.h需要BattleRecord.h来报告战斗,所以我必须在GUI.h中包含BattleRecord.h。为了传递到ViewStat函数中,我还必须包含字符.h。我遇到了错误,一直坚持到现在。

将endif放在文件的末尾,而不是include的末尾,如果编译器支持,则在顶部使用pragma一次,尽管这不太便于移植

编辑:

要进一步解释ifdef&ifndef的作用,请告诉编译器完全从编译中包含或排除代码

// if _UNQIUEHEADERNAME_H_ is NOT defined include and compile this code up to #endif
#ifndef _UNQIUEHEADERNAME_H_
// preprocessor define so next time we include this file it is defined and we skip it
#define _UNQIUEHEADERNAME_H_
// put all the code classes and what not that should only be included once here
#endif // close the statement 
之所以要这样做,是因为包含头文件基本上就是说,将所有代码放在这个文件中。如果多次这样做,那么在最好的情况下,重新定义对象会产生命名冲突,编译时间会变慢。

将endif放在文件的末尾,而不是include的末尾,或者使用pragma一次如果您的编译器支持这一点,尽管它的可移植性较差

编辑:

要进一步解释ifdef&ifndef的作用,请告诉编译器完全从编译中包含或排除代码

// if _UNQIUEHEADERNAME_H_ is NOT defined include and compile this code up to #endif
#ifndef _UNQIUEHEADERNAME_H_
// preprocessor define so next time we include this file it is defined and we skip it
#define _UNQIUEHEADERNAME_H_
// put all the code classes and what not that should only be included once here
#endif // close the statement 

之所以要这样做,是因为包含头文件基本上就是说,将所有代码放在这个文件中。如果多次这样做,那么在最佳情况下,重新定义对象会产生命名冲突,编译时间会变慢。

您使用的包含保护错误。它们应该出现在您只想防止多个包含的文件中,并且应该覆盖整个文件。不只是包括在内

例如,在战记录中

#ifndef _BATTLE_H_
#define _BATTLE_H_
#include "Character.h"

class BattleRecord
{
public:
    Character Attacker;
    Character Defender;
    Status status;
    int DamageDealt;    
    int GoldEarned;
     int ExpGained;
};

#endif // _BATTLE_H_

你用错了防护装置。它们应该出现在您只想防止多个包含的文件中,并且应该覆盖整个文件。不只是包括在内

例如,在战记录中

#ifndef _BATTLE_H_
#define _BATTLE_H_
#include "Character.h"

class BattleRecord
{
public:
    Character Attacker;
    Character Defender;
    Status status;
    int DamageDealt;    
    int GoldEarned;
     int ExpGained;
};

#endif // _BATTLE_H_

通常,使用正向声明而不是包含。这将最大限度地减少包含文件中包含的内容数量。唯一的例外是,当您定义的类是派生类时,则需要包含基类。

通常,使用前向声明而不是包含。这将最大限度地减少包含文件中包含的内容数量。唯一的例外是,当您定义的类是派生类时,则需要包含基类。

除了上面提到的包含保护问题之外,您还有一个_CHARACTEr_H_/_CHARACTEr_H_不匹配,这可能会在GUI.H的第2行上给您带来麻烦,您可能希望修改对象设计,使角色不会攻击敌人,而是有一个战斗类,其中引用两个角色,并在战斗后生成战斗记录。这将防止角色职业在一开始就必须了解战斗记录,允许未来进行多角色战斗,进行多回合战斗,或者通过继承Battle类进行特殊战斗。

除了上面提到的include guard问题外,您还有一个_CHARACTEr_H_/_CHARACTEr_H_不匹配,这可能会在GUI的第2行给您带来麻烦。H,您可能需要修改对象设计,以便该角色不会攻击敌人,但是更确切地说,有一个战斗类,其中引用了两个角色,并在战斗结束后生成了战斗记录。这将防止角色类从一开始就必须了解战斗记录,允许将来进行多角色战斗,进行多回合战斗,或通过继承战斗类进行特殊战斗。

好的,各位

谢谢你帮助我。我已经按照建议重写了头文件的所有内容,现在它工作得完美无缺了。花点时间,因为我在很多课上都犯了错误。

好的,各位


谢谢你帮助我。我已经按照建议重写了头文件的所有内容,现在它工作得完美无缺了。因为我在很多类中都做了错误的操作,所以花了相当长的时间。

也许最后一个文件不是战列记录。h?也许最后一个文件不是战列记录。h?迂腐的注释:必须支持它的是预处理器,而不是编译器;啊,是的,我在每个文件中都放了一次pragma,现在可以用了。谢谢但是,我将通过在末尾添加endif来更改定义头文件的样式。@状态哈哈,是的,这更正确,但我不想作为前言解释编译步骤,因为我怀疑OP相对较新:P@Amumu通常是非此即彼。大多数人更喜欢使用ifndef方法a
它得到了更广泛的支持。下面是两种方法的简要比较:迂腐的注释:必须支持它的是预处理器,而不是编译器;啊,是的,我在每个文件中都放了一次pragma,现在可以用了。谢谢但是,我将通过在末尾添加endif来更改定义头文件的样式。@状态哈哈,是的,这更正确,但我不想作为前言解释编译步骤,因为我怀疑OP相对较新:P@Amumu通常是非此即彼。大多数人更喜欢使用ifndef方法,因为它得到了更广泛的支持。下面是这两种方法的简要比较:好吧,这就是我打算首先使用的方法,通过使用另一个类来处理这场战斗。但是,我想尝试多重包含问题。我将重写标题包含,并继续询问是否还有其他问题。根据我的经验,我发现我遇到的大多数与类相关的多个包含问题都是OO设计的症状,可能需要进行一些重构。好吧,这就是我最初打算做的事,让另一个类来处理这场战斗。但是,我想尝试多重包含问题。我将重写标题包含,并继续询问是否还有其他问题。根据我的经验,我发现我遇到的大多数与类相关的多个包含问题都是可能需要重构的OO设计的症状。这不是唯一的例外。如果定义的类有另一个类的对象,而不是指向该类的指针或引用,则还需要包含。这不是唯一的例外。如果定义的类具有另一个类的对象,而不是指向该类的指针或引用,则还需要包括。