Tengo un problema en MSVC++ 2008, donde VS2008 está lanzando este error de compilación:++ C - "función miembro no declarada" en clase derivada
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
Ahora, lo que me está confundiendo es que render() se define, pero en una clase heredada.
La definición de clase funciona así:
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
lo tanto, una versión reducida de SpriteBase.h es la siguiente:
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 es la siguiente:
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
Y, por último, PlayerSpriteKasua.h es esto:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
Sé que todavía no hay miembros, pero eso es simplemente porque no había llegado a agregarlos. Lo mismo ocurre con PlayerSpriteBase; hay otras cosas que quedan para entrar.
El código en PlayerSpriteKasua.cpp es la siguiente:
#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;
}
Cuando escribo, digamos, void PlayerSpriteKasua::
, Intellisense aparece una lista de todos los miembros de PlayerSpriteBase y SpriteBase muy bien, pero en compilar fracasa como dije encima.
¿Hay algún motivo en particular por el que aparezca este error?
PlayerSpriteBase.cpp está vacío y no tiene nada todavía.
SpriteBase.cpp tiene un montón de definiciones de función para SpriteBase, y utiliza el mismo formato que PlayerSpriteKasua.cpp:
void SpriteBase::died() {
return;
}
es un ejemplo.
Este es el problema aquí. No sabía eso de que C++ me lo hubiera enseñado a mí mismo. ¡Gracias! – Sukasa
¡Bien! Tenga en cuenta que en realidad no tiene que volver a especificar "virtual" aquí (podría funcionar bien sin él), pero es una buena práctica dejarlo, ya que le dice a cualquiera que esté leyendo su código que estos métodos se heredan de una de las clases base . – Ludovic
Vengo del fondo de C# y esto es una locura. Rompe SECO, especialmente si tiene muchas estrategias para hacer lo mismo. –