Pergunta

Eu tenho um problema no MSVC ++ 2008, onde VS2008 está jogando este erro de compilação:

error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'

Agora, o que está me confundindo é que render () é definido, mas em uma classe herdada.

A definição de classe funciona assim:

SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua

Assim, uma pared-down versão do SpriteBase.h é o seguinte:

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 é esta:

class PlayerSpriteBase : public SpriteBase
{
public:
  virtual void pose() = 0;
  virtual void knockback(bool Direction) = 0;
  virtual int getHealth() = 0;
};

E, finalmente, PlayerSpriteKasua.h é esta:

class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};

Eu sei que não há membros em que ainda, mas isso é simplesmente porque eu não tinha chegado a adicioná-los. O mesmo vale para PlayerSpriteBase; há outras coisas saiu para ir a ele.

O código na PlayerSpriteKasua.cpp é esta:

#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;
}

Quando eu digito, digamos, void PlayerSpriteKasua::, Intellisense aparecerá listando todos os membros da PlayerSpriteBase e SpriteBase muito bem, mas na compilação falhar como eu disse acima.

Há alguma razão especial que eu estou recebendo este erro?

PlayerSpriteBase.cpp está vazio e não tem nada nele ainda.

SpriteBase.cpp tem muitas definições de funções para SpriteBase, e usa o mesmo formato que PlayerSpriteKasua.cpp:

void SpriteBase::died() {
  return;
}

é um exemplo.

Foi útil?

Solução

Em PlayerSpriteKasua.h você precisa re-declare quaisquer métodos que você vai override / implementar (sem o "= 0" para dizer que esses métodos não são mais abstrato). Então, você precisa escrevê-lo como segue:

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

... ou você omitir que, para manter o seu post mais curto?

Outras dicas

Você precisa fornecer uma declaração para PlayerSpriteKasua :: render () em sua definição de classe. Caso contrário, outras unidades de tradução incluindo o seu PlayerSpriteKasua.h não seria capaz de dizer que você tinha fornecido uma definição, e seria forçado a concluir que PlayerSpriteKasua não pode ser instanciado.

Você precisa redeclare os membros da SpriteBase que você está indo para implementar em PlayerSpriteKasua na declaração de PlayerSpriteKasua em PlayerSpriteKasua.h.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top