C ++ - & # 8220; Funzione membro non dichiarata & # 8221; in classe derivata
-
06-07-2019 - |
Domanda
Ho un problema in MSVC ++ 2008 in cui VS2008 sta lanciando questo errore di compilazione:
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
Ora, ciò che mi confonde è che render () è definito, ma in una classe ereditata.
La definizione della classe funziona in questo modo:
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
Quindi, una versione ridotta di SpriteBase.h è la seguente:
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 è questo:
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
E infine PlayerSpriteKasua.h è questo:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
So che non ci sono ancora membri, ma è semplicemente perché non ero riuscito ad aggiungerli. Lo stesso vale per PlayerSpriteBase; ci sono altre cose rimaste da approfondire.
Il codice in PlayerSpriteKasua.cpp è questo:
#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 scrivo, diciamo, void PlayerSpriteKasua ::
, Intellisense si apre elencando tutti i membri di PlayerSpriteBase e SpriteBase bene, ma durante la compilazione fallisce come ho detto sopra.
C'è qualche motivo particolare per cui sto ricevendo questo errore?
PlayerSpriteBase.cpp è vuoto e non contiene ancora nulla.
SpriteBase.cpp ha molte definizioni di funzione per SpriteBase e utilizza lo stesso formato di PlayerSpriteKasua.cpp:
void SpriteBase::died() {
return;
}
è un esempio.
Soluzione
In PlayerSpriteKasua.h è necessario dichiarare nuovamente i metodi che verranno sostituiti / implementati (senza lo "quot = = 0" per dire che tali metodi non sono più astratti). Quindi devi scriverlo come segue:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
virtual void think();
virtual void render(long long ScreenX, long long ScreenY);
virtual int getHealth();
};
... o l'hai omesso per ridurre i tuoi post?
Altri suggerimenti
Devi fornire una dichiarazione per PlayerSpriteKasua :: render () nella definizione della tua classe. Altrimenti, altre unità di traduzione tra cui PlayerSpriteKasua.h non sarebbero in grado di dire che hai fornito una definizione e sarebbero costrette a concludere che PlayerSpriteKasua non può essere istanziato.
Devi dichiarare nuovamente i membri di SpriteBase che intendi implementare in PlayerSpriteKasua nella dichiarazione di PlayerSpriteKasua in PlayerSpriteKasua.h.