2009-10-23 12 views
6

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.

Odpowiedz

16

W PlayerSpriteKasua.h musisz ponownie zadeklarować wszelkie metody, które chcesz zastąpić/wdrożyć (bez "= 0", aby powiedzieć, że te metody nie są już abstrakcyjne). Musisz napisać to tak:

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

... czy pominąłeś to, aby Twój post był krótszy?

+0

To jest problem tutaj. Nie wiedziałem, że o C++ nauczyłem się tego. Dzięki! – Sukasa

+5

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

+2

Pochodzę z tła C# i to jest szalone. Łamie DRY, szczególnie jeśli masz wiele strategii robienia tego samego. –

2

Musisz podać deklarację dla PlayerSpriteKasua :: render() w definicji twojej klasy. W przeciwnym razie inne jednostki tłumaczeniowe, w tym odtwarzacz PlayerSpriteKasua.h, nie będą mogły powiedzieć, że podano definicję, i będą zmuszone stwierdzić, że PlayerSpriteKasua nie może być utworzona.

2

Musisz ponownie wyznaczyć członków SpriteBase, które zamierzasz wprowadzić w PlayerSpriteKasua w deklaracji PlayerSpriteKasua w PlayerSpriteKasua.h.

Powiązane problemy