J'ai un problème dans MSVC ++ 2008 où vs2008 lance cette erreur de compilation: maintenant, ce qui me confondre est que le rendu () est défini, mais dans une classe héritée. p> La définition de la classe fonctionne comme ceci: p> donc, une version pared-down de spritebase.h est la suivante: p> playerpritebase.h est-ce: p> et enfin, le jeupritekasua.h est-ce: p> Le code dans les playerpritekasua.cpp est-ce: p> quand je tape, disons, Y a-t-il une raison particulière que je reçois cette raison Erreur? p> playerpritebase.cpp est vide et n'a encore rien dedans. p> spritebase.cpp a beaucoup de définitions de fonction pour SpritBase et utilise le même format que les joueurspritekasua.cpp : p> est un exemple. p> p> Void Playerpritekasua :: Code>, 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. P>
3 Réponses :
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. P>
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. P>
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(); };
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.