我在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;
}

就是一个例子。

有帮助吗?

解决方案

在PlayerSpriteKasua.h中,你需要重新声明你要覆盖/实现的任何方法(没有“= 0”表示那些方法不再是抽象的)。所以你需要写如下:

class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
    virtual void think();
    virtual void render(long long ScreenX, long long ScreenY);
    virtual int getHealth();
};

...或者你是否忽略了这一点以缩短你的职位?

其他提示

您需要在类定义中为PlayerSpriteKasua :: render()提供声明。否则,包括您的PlayerSpriteKasua.h在内的其他翻译单元将无法判断您是否提供了定义,并且不得不断定PlayerSpriteKasua无法实例化。

您需要在PlayerSpriteKasua.h中的PlayerSpriteKasua声明中重新声明要在PlayerSpriteKasua中实现的SpriteBase成员。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top