2011-04-25 56 views
3

我有一個 循環冗餘 我的項目中的兩個類之間的循環依賴關係StatusEffectBaseCharacter正向聲明問題

兩個類都需要知道對方的BaseCharacter需要存儲一組StatusEffect S和StatusEffect需要能夠做到對BaseCharacter操作。我不認爲有可能消除這種行爲,並保持正常工作。這裏就是我想現在做的事:

基本字符命名空間Game::Character內部存在和StatusEffect存在命名空間Game::StatusEffects

內StatusEffects.h,我前宣佈BaseCharacter像這樣裏面:

namespace Game { 
    namespace Character { 
     class BaseCharacter; 
    } 
} 

然後在它下面,我有:

namespace Game 
{ 
    namespace StatusEffects 
    { 
     class StatusEffect 
     { 
     public: 
      virtual void TickCharacter(Game::Character::BaseCharacter* character, int ticks = 1) 
      { 
       std::cout << "Name " << character->GetName() << std::endl; 
      } 
     protected: 
     private: 
      std::string name; 
      int StatusEffectUID; 
     }; 
    } 
} 

然而,這是GIV給我一個編譯器錯誤:

Error 1 error C2027: use of undefined type 'Game::Character::BaseCharacter'

我認爲,因爲我使用的指針,這個前瞻性聲明是好的。還有什麼我需要轉發聲明?我不需要提交聲明整個類的定義嗎?

+0

當你說「循環冗餘」時,你真的指「循環依賴」嗎? – 2011-04-25 09:43:47

+0

啊啊...不知道爲什麼我把循環冗餘 – Megatron 2011-04-25 16:56:24

回答

9

您不能通過指向前向聲明類的指針調用方法。您必須將該代碼移到某個類已經定義的地方 - 例如,將其轉換爲包含這兩個類定義的.cpp文件。

+0

爲什麼你想要在頭中定義這個虛擬方法? – 2011-04-25 09:41:53

+0

@inflagranti:有時,對虛擬方法的調用可能是非虛擬的。 – sharptooth 2011-04-25 10:01:48

+0

我知道這一點,但是,我想檢查這些具體情況是否適用於這種情況;並且代碼的「熱」足以保證爲了性能原因在代碼中放入代碼。 – 2011-04-26 07:38:52

2

您的轉發declaration是好的。但是,您不得提及此類的任何成員。

您應該只在頭文件中聲明TickCharacter方法。然後在#include包含完整聲明BaseCharacter的頭文件之後,您應該在其自己的模塊文件中defineStatusEffect::TickCharacter方法。