C++ - "Member-Funktion nicht deklariert" in der abgeleiteten Klasse
Ich habe ein problem in MSVC++ 2008, wo VS2008 wirft diese compile-Fehler:
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
Nun, was verwirrt mich ist, dass die render() definiert ist, aber in einer geerbten Klasse.
Der definition der Klasse, funktioniert wie folgt:
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
So, eine abgespeckte version von SpriteBase.h ist die folgende:
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:
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
Und schließlich PlayerSpriteKasua.h:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
Ich weiß, es gibt keine Mitglieder die in es noch, aber das ist einfach weil ich noch nicht bekommen hatte, um Sie zu addieren. Gleiches gilt für PlayerSpriteBase; es gibt andere Sachen, Links zu gehen, um es.
Den code in PlayerSpriteKasua.cpp ist diese:
#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;
}
Geben, wenn ich, sagen wir, void PlayerSpriteKasua::
Intellisense erscheint mit einer Liste aller Mitglieder der PlayerSpriteBase und SpriteBase nur gut, aber am kompilieren scheitert es, wie ich oben sagte.
Gibt es einen bestimmten Grund, warum ich diese Fehlermeldung bekommen?
PlayerSpriteBase.cpp ist leer und hat nichts in es noch.
SpriteBase.cpp hat viele Funktion Definitionen für SpriteBase, und verwendet das gleiche format wie PlayerSpriteKasua.cpp:
void SpriteBase::died() {
return;
}
ist ein Beispiel.
InformationsquelleAutor Sukasa | 2009-10-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
In PlayerSpriteKasua.h Sie brauchen, um wieder zu erklären, was Methoden, die Sie gehen zu überschreiben/implementieren (ohne das "=0", um zu sagen, dass diese Methoden nicht Abstrakt mehr). So müssen Sie schreiben es wie folgt:
...oder hast du Sie weglassen, um Ihre post kürzer?
Gut! Beachten Sie, dass Sie nicht wirklich haben, geben Sie "virtuell" wieder hier (es würde funktionieren, ohne es), aber es ist gute Praxis, es zu verlassen, wie Sie es sagt, wer Lesen Ihrem code, dass diese Methoden geerbt von einer der Basisklassen.
Ich komme aus der C# - hintergrund und das ist verrückt. Es bricht TROCKEN, vor allem wenn Sie viele Strategien, die gleiche Sache zu tun.
InformationsquelleAutor Ludovic Chabant
Müssen Sie eine Erklärung für PlayerSpriteKasua::render() in der Klasse definition. Ansonsten, andere übersetzung-Einheiten einschließlich Ihrer PlayerSpriteKasua.h wäre nicht in der Lage zu sagen, dass Sie möchten, sofern eine definition, und würde gezwungen sein, zu schließen, dass PlayerSpriteKasua kann nicht instanziiert werden.
InformationsquelleAutor David Seiler
Müssen Sie deklarieren die Mitglieder SpriteBase, dass Sie gehen zu implementieren, in PlayerSpriteKasua in der Erklärung der PlayerSpriteKasua in PlayerSpriteKasua.h.
InformationsquelleAutor GBegen