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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top