8
votes

C ++ - "Fonction membre non déclarée" en classe dérivée

J'ai un problème dans MSVC ++ 2008 où vs2008 lance cette erreur de compilation: xxx

maintenant, ce qui me confondre est que le rendu () est défini, mais dans une classe héritée.

La définition de la classe fonctionne comme ceci: xxx

donc, une version pared-down de spritebase.h est la suivante: xxx

playerpritebase.h est-ce: xxx

et enfin, le jeupritekasua.h est-ce: xxx < P> Je sais qu'il n'y a pas encore de membres, mais c'est tout simplement parce que je n'avais pas eu de les ajouter. Même chose pour les joueurspritebase; Il reste d'autres choses à y aller.

Le code dans les playerpritekasua.cpp est-ce: xxx

quand je tape, disons, Void Playerpritekasua :: , Intellisense apparaît énumérant tous les membres de PlayerpriteBase et Spritebase tout à fait bien, mais sur la compilée échoue comme je l'ai dit ci-dessus.

Y a-t-il une raison particulière que je reçois cette raison Erreur?

playerpritebase.cpp est vide et n'a encore rien dedans.

spritebase.cpp a beaucoup de définitions de fonction pour SpritBase et utilise le même format que les joueurspritekasua.cpp : xxx

est un exemple.


0 commentaires

3 Réponses :


2
votes

Vous devez fournir une déclaration pour les joueurspritekasua :: Render () dans votre définition de classe. Sinon, d'autres unités de traduction, y compris vos joueurspritekasua.h, ne seraient pas en mesure de dire que vous avez fourni une définition, et serait obligé de conclure que les joueurspritekasua ne peuvent pas être instanciés.


0 commentaires

2
votes

Vous devez redéclaré aux membres de SpritBase que vous allez mettre en œuvre dans les Playerspritekasua dans la Déclaration des joueurspritekasua dans les joueurspritekasua.h.


0 commentaires

17
votes

dans les joueurspritekasua.h Vous devez refluer les méthodes que vous allez remplacer / mettre en œuvre (sans le "= 0" pour dire que ces méthodes ne sont plus abstraites). Donc, vous devez l'écrire comme suit:

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


3 commentaires

C'est le problème ici. Je ne savais pas qu'à propos de C ++ l'avoir enseigné. Merci!


Bon! Notez que vous n'avez pas vraiment à spécifier "virtuel" à nouveau ici (cela fonctionnerait bien sans elle) mais c'est une bonne pratique de le laisser, car il indique quiconque lisant votre code que ces méthodes sont héritées de l'une des classes de base.


Je viens de fond C # et c'est fou. Il sèche, surtout si vous avez de nombreuses stratégies de faire la même chose.