C ++ - & # 8220; Функция-член не объявлена & # 8221; в производном классе
-
06-07-2019 - |
Вопрос
У меня проблема в MSVC ++ 2008, где VS2008 выдает эту ошибку компиляции:
error C2509: 'render' : member function not declared in 'PlayerSpriteKasua'
Теперь меня смущает то, что render () определен, но в унаследованном классе.
Определение класса работает так:
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;
}
является примером.
Решение
В PlayerSpriteKasua.h вам необходимо повторно объявить любые методы, которые вы собираетесь переопределить / реализовать (без " = 0>, чтобы сказать, что эти методы больше не являются абстрактными). Поэтому вам нужно написать это следующим образом:
class PlayerSpriteKasua : public PlayerSpriteBase
{
public:
virtual void think();
virtual void render(long long ScreenX, long long ScreenY);
virtual int getHealth();
};
... или вы пропустили это, чтобы сократить количество сообщений?
Другие советы
Вы должны предоставить объявление для PlayerSpriteKasua :: render () в своем определении класса. В противном случае другие единицы перевода, включая ваш PlayerSpriteKasua.h, не смогут сказать, что вы предоставили определение, и будут вынуждены сделать вывод, что PlayerSpriteKasua не может быть создан.
Вам необходимо повторно объявить членов SpriteBase, которые вы собираетесь реализовать в PlayerSpriteKasua, в объявлении PlayerSpriteKasua в PlayerSpriteKasua.h.