質問

VSSVCがこのコンパイルエラーをスローするMSVC ++ 2008に問題があります:

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をインスタンス化できないと結論付けられます。

PlayerSpriteKasua.hのPlayerSpriteKasuaの宣言でPlayerSpriteKasuaに実装するSpriteBaseのメンバーを再宣言する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top