2011-07-09 42 views
4

我的應用程序中的類似這樣工作:Creature幾乎沒有字段Action s。當這些Action必須運行時Creature調用someActionField->do(this)。行動有方法viod do(Creature* cr)和關於如何處理這個Creature的所有信息。C++類互相引用(=>錯誤+字段'...'的類型不完整)

所以,Creature必須有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中 - 我使用'之前的文件'。

回答

8

Creature類的成員的類型Action。編譯器需要知道Action類的完整定義以編譯它 - 使用前向聲明生成的不完整類型是不夠的。

Action類只需要一個指針到在報頭中的Creature對象。在這種情況下,編譯器只需知道Creature將在某個時刻定義。

在你的具體情況下,你可以避開你聲明你的類的順序。

(即在action.h正向聲明Creature,並且包括在action.hcreature.h

+0

是的,我發現那只是你前一秒鐘張貼。 :) 不管怎麼說,還是要謝謝你。 –

+0

關於引用的部分是*錯誤*。引用和指針需要相同的知識。另外,在OP的代碼中沒有參考,只有完整的對象。 – Xeo

+0

@Xeo:這的確措辭很差。 – Mat

3

在action.h把class Creature;並在另一個​​

爲指針,你並不需要完整的定義,因爲它只是一個指針,編譯器可以爲它生成的「代碼」。如果使用簡單的類/結構,編譯器必須知道類型,因爲它需要知道它有多大。

2

你不需要在action.h中包含「creature.h」。所有你需要的是類生物的前進聲明。你需要在creature.h中包含「action.h」,因爲onHit和onDie是Action的實例。

3

向前聲明一個類型,所有的編譯器知道的是,這種類型的存在;因此它不知道它的大小,成員或方法,因此它被稱爲不完全類型

不能使用不完全類型來聲明一個成員(因爲編譯需要知道類型的大小,同時宣佈它),因此你得到的錯誤。

你不需要#include「creature.h」。但你只需要轉發聲明類生物。你需要在creature.h#包括 「action.h」

你的頭文件應該有下面的結構:

creature.h

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

action.h

class creature; 

這使用了兩條規則:

  • 人們可以聲明它接受功能或方法/返回不完全類型:

action.h只聲明它接受一個不完整的類型(生物)的函數的

  • 到一個不能聲明一個構件不完整類型。

creature.h必須包括action.h因爲它聲明Action類型的成員。

0

使用引用或指針:

 #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

相關問題