C ++ - «Функция-член не объявлена» в производном классе - PullRequest
7 голосов
/ 24 октября 2009

У меня проблема в 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;
}

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

Ответы [ 3 ]

16 голосов
/ 24 октября 2009

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

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

... или вы пропустили это, чтобы сократить срок публикации?

2 голосов
/ 24 октября 2009

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

2 голосов
/ 24 октября 2009

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

...