C ++-“メンバー関数が宣言されていません”派生クラスで
-
06-07-2019 - |
質問
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のメンバーを再宣言する必要があります。