2011-04-25 70 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方法。