前向声明问题

时间:2011-04-25 09:28:29

标签: c++ forward-declaration

我的项目StatusEffectBaseCharacter中的两个类之间存在循环冗余循环依赖关系。

两个类都需要彼此了解,因为BaseCharacter需要存储一组StatusEffectStatusEffect需要能够对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;
        };
    }
}

但是,这给了我一个编译器错误:

  

错误1错误C2027:使用未定义类型'Game :: Character :: BaseCharacter'

我认为,因为我正在使用指针,这个前向声明很好。我需要转发申报吗?我不需要转发声明整个类定义吗?

2 个答案:

答案 0 :(得分:9)

您不能通过指向前向声明的类的指针来调用方法。您必须将此代码移动到已定义类的位置 - 例如,移动到包含两个类定义的.cpp文件中。

答案 1 :(得分:2)

你的前锋declaration没问题。但是,您不得引用此类的任何成员。

您应该只在标题中声明TickCharacter方法。在define包含StatusEffect::TickCharacter完整声明的头文件之后,您应该#include BaseCharacter方法在其自己的模块文件中。