Mam problem w MSVC++ 2008 gdzie VS2008 rzuca ten błąd kompilacji:C++ - „funkcja Użytkownik nie uznane” w klasie pochodnej
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
Teraz co mi mylące jest to, że render() jest zdefiniowana, ale w odziedziczonej klasie.
Definicja klasy działa tak:
SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua
Tak, oszczędna wersja SpriteBase.h jest następujący:
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 to:
class PlayerSpriteBase : public SpriteBase
{
public:
virtual void pose() = 0;
virtual void knockback(bool Direction) = 0;
virtual int getHealth() = 0;
};
Wreszcie odtwarzacz PlayerSpriteKasua.h to:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
};
Wiem, że nie ma w nim jeszcze członków, ale to po prostu dlatego, że nie mogłem ich dodać. To samo dotyczy PlayerSpriteBase; pozostały jeszcze inne rzeczy.
Kod w PlayerSpriteKasua.cpp to:
#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;
}
Po wpisaniu, powiedzmy, void PlayerSpriteKasua::
, Intellisense wyskakuje wykaz wszystkich członków PlayerSpriteBase i SpriteBase dobrze, ale na kompilacji nie powiedzie się, jakbym powiedział powyżej.
Czy istnieje jakiś szczególny powód, dla którego otrzymuję ten błąd?
PlayerSpriteBase.cpp jest pusty i nie ma w nim jeszcze nic.
SpriteBase.cpp ma wiele definicji funkcji dla SpriteBase i wykorzystuje ten sam format jak PlayerSpriteKasua.cpp:
void SpriteBase::died() {
return;
}
jest przykładem.
To jest problem tutaj. Nie wiedziałem, że o C++ nauczyłem się tego. Dzięki! – Sukasa
Dobrze! Zauważ, że tak naprawdę nie musisz tu ponownie określać "wirtualnego" (bez niego działałoby), ale dobrze jest zostawić to, ponieważ mówi on każdemu, kto czyta twój kod, że te metody są dziedziczone z jednej z klas bazowych. . – Ludovic
Pochodzę z tła C# i to jest szalone. Łamie DRY, szczególnie jeśli masz wiele strategii robienia tego samego. –