2009-10-23 4 views
6

У меня есть проблема в MSVC++ 2008, где VS2008 бросает эту ошибку компиляции:C++ - «функция-член не объявлен» в производном классе

error C2509: 'render' : member function not declared in 'PlayerSpriteKasua' 

Теперь, что меня смущает то, что делают() определена, но в унаследованном классе.

Определение класса работает следующим образом:

SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua 

Таким образом, урезанный вариант SpriteBase.h заключается в следующем:

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; 
}; 

И, наконец, PlayerSpriteKasua.h:

class PlayerSpriteKasua : public PlayerSpriteBase 
{ 
public: 
}; 

Я знаю, что в нем нет участников, но это просто потому, что я не смог их добавить. То же самое касается PlayerSpriteBase; есть еще кое-что, что осталось для этого.

Код в PlayerSpriteKasua.cpp это:

#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; 
} 

Когда я типа, скажем, void PlayerSpriteKasua::, Intellisense выскочит список всех членов PlayerSpriteBase и SpriteBase просто отлично, но на компиляции он не сказал, как я выше.

Есть ли какая-то особая причина, по которой я получаю эту ошибку?

PlayerSpriteBase.cpp пуст и на нем пока ничего не было.

SpriteBase.cpp имеет множество определений функций для SpriteBase, и использует тот же формат, как PlayerSpriteKasua.cpp:

void SpriteBase::died() { 
    return; 
} 

является примером.

ответ

16

В PlayerSpriteKasua.h вам нужно повторно объявить все методы, которые вы собираетесь переопределить/реализовать (без «= 0», чтобы сказать, что эти методы больше не являются абстрактными). Поэтому вам нужно написать его следующим образом:

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

... или вы пропустили это, чтобы сохранить ваше сообщение короче?

+0

Это проблема прямо здесь. Я не знал, что о C++ научил себя этому. Благодаря! – Sukasa

+5

Хорошо! Обратите внимание, что здесь вам не нужно указывать здесь «виртуальный» (он будет работать без него), но это хорошая практика, чтобы оставить его, поскольку он сообщает, кто читает ваш код, что эти методы наследуются от одного из базовых классов , – Ludovic

+2

Я родом из C#, и это безумие. Он ломается СУХОЙ, особенно если у вас много стратегий делать то же самое. –

2

Вам необходимо предоставить объявление для PlayerSpriteKasua :: render() в определении вашего класса. В противном случае другие единицы перевода, включая ваш PlayerSpriteKasua.h, не смогут сказать, что вы предоставили определение, и были бы вынуждены заключить, что PlayerSpriteKasua не может быть создан.

2

Вам необходимо обновить элементы SpriteBase, которые вы собираетесь реализовать в PlayerSpriteKasua в объявлении PlayerSpriteKasua в PlayerSpriteKasua.h.

 Смежные вопросы

  • Нет связанных вопросов^_^