C ++ - “função de membro não declarado” na classe derivada
-
06-07-2019 - |
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.
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.