Question

J'ai un problème dans MSVC ++ 2008 où VS2008 renvoie cette erreur de compilation:

error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'

Maintenant, ce qui me trouble, c'est que render () est défini, mais dans une classe héritée.

La définition de la classe fonctionne comme suit:

SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua

Ainsi, une version simplifiée de SpriteBase.h est la suivante:

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 est la suivante:

class PlayerSpriteBase : public SpriteBase
{
public:
  virtual void pose() = 0;
  virtual void knockback(bool Direction) = 0;
  virtual int getHealth() = 0;
};

Et enfin, PlayerSpriteKasua.h est la suivante:

class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};

Je sais qu’il n’ya pas encore de membres, mais c’est tout simplement parce que je n’étais pas arrivé à les ajouter. Il en va de même pour PlayerSpriteBase; il reste encore d'autres choses à faire.

Le code dans PlayerSpriteKasua.cpp est le suivant:

#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;
}

Lorsque je tape, par exemple, dans PlayerSpriteKasua :: , Intellisense apparaît et répertorie tous les membres de PlayerSpriteBase et de SpriteBase, mais la compilation échoue, comme je l’ai dit plus haut.

Y a-t-il une raison particulière pour laquelle je reçois cette erreur?

PlayerSpriteBase.cpp est vide et ne contient rien pour le moment.

SpriteBase.cpp contient de nombreuses définitions de fonctions pour SpriteBase et utilise le même format que PlayerSpriteKasua.cpp:

void SpriteBase::died() {
  return;
}

est un exemple.

Était-ce utile?

La solution

Dans PlayerSpriteKasua.h, vous devez déclarer à nouveau les méthodes à remplacer / implémenter (sans le "+ 0" pour indiquer que ces méthodes ne sont plus abstraites). Vous devez donc l'écrire comme suit:

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

... ou avez-vous omis de garder votre message plus court?

Autres conseils

Vous devez fournir une déclaration pour PlayerSpriteKasua :: render () dans votre définition de classe. Sinon, d'autres unités de traduction, y compris PlayerSpriteKasua.h, ne seraient pas en mesure de dire que vous aviez fourni une définition et seraient obligées de conclure que PlayerSpriteKasua ne peut pas être instancié.

Vous devez redéclarer les membres de SpriteBase que vous allez implémenter dans PlayerSpriteKasua dans la déclaration de PlayerSpriteKasua dans PlayerSpriteKasua.h.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top