我正在做一个小游戏。
在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函数。我得到了错误,并坚持到这个piont。
答案 0 :(得分:11)
你使用包含警卫错了。它们应出现在您打算仅防止多个包含的文件中,并且它们应覆盖整个文件。 (不只是包括)。
例如,在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_
答案 1 :(得分: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
你想要这样做的原因是因为包含一个头文件基本上是说“把所有代码都放在这个文件中”,如果多次这样做,那么你就会有重新定义对象的命名冲突和减慢编译时间最佳方案。
答案 2 :(得分:1)
通常,使用前向声明而不是包含。这可以最大限度地减少包含文件所包含的数量。唯一的例外是当您定义的类是派生类时,则需要包含基类。
答案 3 :(得分:0)
除了上面提到的包含保护问题(你还有_CHARACTEr_H _ / _ CHARACTER_H_不匹配可能会导致你在GUI.h的第2行出现问题),你可能想要修改你的对象设计,以便角色不会攻击敌人(),而是有一个Battle()类,其中引用了两个角色,并且在战斗之后产生了BattleRecord。这将阻止角色类首先了解战斗记录,允许未来进行多角色战斗的可能性,进行多回合战斗,或通过继承战斗类进行特殊战斗。 / p>
答案 4 :(得分:0)
确定所有人,
感谢您帮助我。我按照建议重写了头文件的所有内容,现在它完美无瑕。我花了很多时间,因为我在很多课程上做错了。