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 に含める必要があります。ViewStat 関数に渡すために Character.h も含める必要があります。エラーが発生し、このピオントまでこれに固執しました。

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

上記のインクルード ガードの問題 (GUI.h の 2 行目に問題を引き起こす可能性のある _CHARACTER_H_/_CHARACTER_H_ の不一致もあります) に加えて、キャラクターが AttackEnemy()、むしろ、2 つの Character が参照され、BattleRecord が戦闘後に生成される Battle() クラスがあります。これにより、最初に Character クラスが BattleRecords について知る必要がなくなり、将来のマルチキャラクター バトル、マルチターン バトル、または Battle クラスの継承による特別なバトルの可能性が考慮されます。

于 2011-02-24T15:40:37.710 に答える
0

では皆さん、

私を助けてくれてありがとう。提案どおりにヘッダー ファイルのすべてのインクルードを書き直しましたが、今では問題なく動作します。多くのクラスで間違っていたので、かなり時間がかかりました。

于 2011-02-24T16:39:58.730 に答える