我的项目StatusEffect
和BaseCharacter
中的两个类之间存在循环冗余循环依赖关系。
两个类都需要彼此了解,因为BaseCharacter
需要存储一组StatusEffect
和StatusEffect
需要能够对BaseCharacter
执行操作。我不认为可以消除这种行为并仍然可以正常工作。这就是我现在要做的事情:
基础字符存在于名称空间Game::Character
内,StatusEffect
存在于名称空间Game::StatusEffects
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'
我认为,因为我正在使用指针,这个前向声明很好。我需要转发申报吗?我不需要转发声明整个类定义吗?
答案 0 :(得分:9)
您不能通过指向前向声明的类的指针来调用方法。您必须将此代码移动到已定义类的位置 - 例如,移动到包含两个类定义的.cpp文件中。
答案 1 :(得分:2)
你的前锋declaration
没问题。但是,您不得引用此类的任何成员。
您应该只在标题中声明TickCharacter方法。在define
包含StatusEffect::TickCharacter
完整声明的头文件之后,您应该#include
BaseCharacter
方法在其自己的模块文件中。