2009-10-23 22 views
6

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.

Respuesta

16

En PlayerSpriteKasua.h necesita volver a declarar los métodos que va a anular/implementar (sin el "= 0" para decir que esos métodos ya no son abstractos). Por lo tanto, debe escribirlo de la siguiente manera:

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

... ¿O lo omitió para mantener su publicación más corta?

+0

Este es el problema aquí. No sabía eso de que C++ me lo hubiera enseñado a mí mismo. ¡Gracias! – Sukasa

+5

¡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

+2

Vengo del fondo de C# y esto es una locura. Rompe SECO, especialmente si tiene muchas estrategias para hacer lo mismo. –

2

Debe proporcionar una declaración para PlayerSpriteKasua :: render() en la definición de su clase. De lo contrario, otras unidades de traducción, incluido tu PlayerSpriteKasua.h, no podrían decir que has proporcionado una definición, y se verían obligados a concluir que PlayerSpriteKasua no se puede crear una instancia.

2

Necesitas redeclarar los miembros de SpriteBase que vas a implementar en PlayerSpriteKasua en la declaración de PlayerSpriteKasua en PlayerSpriteKasua.h.

Cuestiones relacionadas