我在MSVC ++ 2008中遇到问题,其中VS2008抛出了这个编译错误:
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
现在,令我困惑的是,render()已定义,但是在继承的类中。
类定义的工作原理如下:
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
因此,SpriteBase.h的精简版本如下:
class SpriteBase {
public:
//Variables=============================================
-snip-
//Primary Functions=====================================
virtual void think()=0; //Called every frame to allow the sprite to process events and react to the player.
virtual void render(long long ScreenX, long long ScreenY)=0; //Called every frame to render the sprite.
//Various overridable and not service/event functions===
virtual void died(); //Called when the sprite is killed either externally or via SpriteBase::kill().
-snip-
//======================================================
};
PlayerSpriteBase.h是这样的:
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
最后,PlayerSpriteKasua.h是这样的:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
我知道其中还没有成员,但那仅仅是因为我没有添加它们。 PlayerSpriteBase也是如此;还有其他东西要进去。
PlayerSpriteKasua.cpp中的代码是:
#include "../../../MegaJul.h" //Include all the files needed in one go
void PlayerSpriteKasua::render(long long ScreenX, long long ScreenY) {
return;
}
void PlayerSpriteKasua::think() {
return;
}
int PlayerSpriteKasua::getHealth() {
return this->Health;
}
当我键入,例如void PlayerSpriteKasua::
时,Intellisense弹出列出PlayerSpriteBase和SpriteBase的所有成员就好了,但是在编译时它就像我上面说的那样失败。
我有任何特殊原因导致此错误吗?
PlayerSpriteBase.cpp为空,但尚未包含任何内容。
SpriteBase.cpp有很多SpriteBase的函数定义,并使用与PlayerSpriteKasua.cpp相同的格式:
void SpriteBase::died() {
return;
}
就是一个例子。
答案 0 :(得分:16)
在PlayerSpriteKasua.h中,你需要重新声明你要覆盖/实现的任何方法(没有“= 0”表示那些方法不再是抽象的)。所以你需要写如下:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
virtual void think();
virtual void render(long long ScreenX, long long ScreenY);
virtual int getHealth();
};
...或者你是否忽略了这一点以缩短你的职位?
答案 1 :(得分:2)
您需要在类定义中为PlayerSpriteKasua :: render()提供声明。否则,包括您的PlayerSpriteKasua.h在内的其他翻译单元将无法判断您是否提供了定义,并且不得不断定PlayerSpriteKasua无法实例化。
答案 2 :(得分:2)
您需要在PlayerSpriteKasua.h中的PlayerSpriteKasua声明中重新声明要在PlayerSpriteKasua中实现的SpriteBase成员。