سؤال

ولدي مشكلة في MSVC ++ 2008 حيث VS2008 هو رمي هذا خطأ ترجمة:

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::، التحسس للملوثات العضوية الثابتة سرد كافة أعضاء 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 :: تقديم () في تعريف الفئة الخاصة بك. وإلا، فإن وحدة الترجمة الأخرى بما في ذلك PlayerSpriteKasua.h الخاص لن يكون قادرا على ان اقول ان كنت قدمت تعريفا، وسوف تضطر إلى الاستنتاج بأن PlayerSpriteKasua لا يمكن إنشاء مثيل.

وتحتاج إلى redeclare أعضاء SpriteBase أنك ذاهب لتنفيذ في PlayerSpriteKasua في إعلان PlayerSpriteKasua في PlayerSpriteKasua.h.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top