2

我正在做一个小游戏。

在 BattleRecord.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;
};

在 Character.h 中:

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

class BattleRecord;
class Character
{
BattleRecord AttackEnemy(Character &Enemy);
}

在 BattleRecord.h 中:

#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)
}

这里的问题是,我的 Character.h 和 BattleRecord.h 需要相互包含,这肯定会导致多重重定义问题。因此,我在 Character.h 中使用前向声明添加:

class BattleRecord;

问题已解决。但是,GUI.h 又需要 BattleRecord.h 来报告战斗,所以我必须将 BattleRecord.h 包含到 GUI.h 中。我还必须包含 Character.h 才能传递给 ViewStat 函数。我得到了错误并坚持到这个点。

4

5 回答 5

12

您错误地使用了包含防护。它们应该出现在您打算仅防止多次包含的文件中,并且它们应该覆盖整个文件。(不仅仅是包含)。

例如,在 BattleRecord.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_
于 2011-02-24T15:28:39.013 回答
3

如果您的编译器支持这一点,则将您放在#endif文件的末尾而不是包含的末尾或使用的末尾,#pragma once尽管这样可移植性较差。

编辑:

进一步解释#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 

你想这样做的原因是因为包含一个头文件基本上是说“把这个文件中的所有代码都放在这里”,如果你多次这样做,那么你会因为重新定义对象而产生命名冲突,并且在最佳情况下会减慢编译时间.

于 2011-02-24T15:27:16.487 回答
1

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

于 2011-02-24T15:30:33.090 回答
0

除了上面提到的包含保护问题(您还有一个 _CHARACTER_H_/_CHARACTER_H_ 不匹配可能会导致您在 GUI.h 的第 2 行遇到麻烦),您可能需要修改您的对象设计,以便角色不会 AttackEnemy(),而是有一个 Battle() 类,其中引用了两个角色,并在战斗后产生了 BattleRecord。这样一来,Character 类就不必知道 BattleRecords,将来可能会进行多角色战斗,进行多回合战斗,或者通过继承 Battle 类进行特殊战斗。

于 2011-02-24T15:40:37.710 回答
0

大家好,

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

于 2011-02-24T16:39:58.730 回答