2011-07-09 10 views
4

CreatureのアプリケーションのクラスはActionでほとんどありません。これらのActionを実行する必要がある場合は、CreaturesomeActionField->do(this)としてください。アクションにはviod do(Creature* cr)というメソッドと、これに関連するすべての情報があります。CreatureC++クラスは互いに参照します(=>エラー+フィールド '...'は不完全な型です)

この場合、クリーチャーはActionフィールドを持つ必要があり、Actiondoの方法を持っている必要があります。アクションはCreatureは以下のようなフィールドを持っていることを知っている必要があります、HPは、等...

私が持っているのでしょう

creature.h

#include "effect.h" 
#include "heedupdate.h" 

namespace Core 
{ 

class Action; 

class Creature : public NeedUpDate 
{ 
public: 
    virtual ~Creature(); 
    int HP; 
    Action onHit; 
    Action onDie; 
// ... 


}; 

} 
#endif 

そしてaction.h

#include "creature.h" 

namespace Core 
{ 


class Action 
{ 
public: 
Action(); 
virtual void _do(Creature* cr); 
virtual ~Action(); 
}; 

しかし、この場合はフィールド`onDie' has incomplete typeが表示されます。 action.hをcreature.hに含めると、私は '互いの前に'ファイルを使用します。 action.hで

答えて

8

Creatureクラスには、タイプActionのメンバーがあります。コンパイラは、コンパイルするために、Actionクラスの完全な定義を知る必要があります。前方宣言で生成されるような不完全な型では不十分です。

Actionクラスは、そのヘッダ内Creatureオブジェクトへポインタを必要とします。その場合、コンパイラはある時点でCreatureが定義されることを知る必要があります。

具体的には、クラスを宣言する順序を逆転させることができます。

(すなわちaction.hCreatureを前進宣言し、creature.haction.hを含める)

+0

完全に宣言Actionクラスを必要とする依存関係を壊すことができず、

 #include "effect.h" #include "heedupdate.h" namespace Core { class Action; class Creature : public NeedUpDate { public: virtual ~Creature(); int HP; Action & onHit; Action & onDie; // ... }; } #endif 

この方法であなたはそれを投稿する前に、私はちょうど秒をつかまえました。 :) とにかくありがとう。 –

+0

参考文献の一部は*間違っています。参照とポインタには同じ知識が必要です。また、OPのコードには参照がなく、完全なオブジェクトのみが含まれています。 – Xeo

+0

@ Xeo:それは本当に言葉にはほとんど言わなかった。 – Mat

3

class Creature;を入れて、それだけでポインタだと、コンパイラはそれのために、「コード」を生成することができますので、ポインタのために他の1​​

に、あなたは完全な定義を必要としません。単純なクラス/構造体を使用する場合、コンパイラは型の知識が必要です。なぜなら、大きさを知る必要があるからです。

2

action.hに#include "creature.h"を入れる必要はありません。あなたが必要とするのは、クラスCreatureの前方宣言だけです。 onHitとonDieはActionのインスタンスなので、creature.hに#include "action.h"が必要です。

3

あなたは前方タイプを宣言し、すべてのコンパイラは、このタイプが存在することを知っています。それが宣言しながら、コンパイルが型のサイズを知る必要がありますので、あなたは(メンバーを宣言するために、不完全な型を使用することはできませんので、それは不完全な型

と呼ばれ、その大きさ、メンバー、または方法について何も知りませんそれで)あなたはエラーを受け取ります。

「creature.h」を#includeする必要はありません。あなたはクラスクリーチャーを宣言するだけです。

creature.h

action.h

#include "effect.h" 
#include "action.h" 
#include "heedupdate.h" 

:あなたはあなたのヘッダファイルは、以下の構造を持っている必要があり

creature.hで "action.h" を#includeする必要があります
class creature; 

これは2つのルールを使用します:

  • 一つは不完全型を返す/受け入れる関数またはメソッドを宣言することができ:

action.hは一つのみにメンバを宣言することができない不完全型(クリーチャー)

  • を受け付ける機能を宣言不完全な型。

creature.hは、それがタイプActionのメンバーを宣言するためaction.hを含める必要があります。

0

使用の参照、またはポインタ:あなたがはい

関連する問題