У меня есть проблема в 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;
}
является примером.
Это проблема прямо здесь. Я не знал, что о C++ научил себя этому. Благодаря! – Sukasa
Хорошо! Обратите внимание, что здесь вам не нужно указывать здесь «виртуальный» (он будет работать без него), но это хорошая практика, чтобы оставить его, поскольку он сообщает, кто читает ваш код, что эти методы наследуются от одного из базовых классов , – Ludovic
Я родом из C#, и это безумие. Он ломается СУХОЙ, особенно если у вас много стратегий делать то же самое. –