2009-10-23 31 views
6

में मैं MSVC++ 2008 में एक समस्या है जहां VS2008 इस संकलन त्रुटि फेंक है:सी ++ - "सदस्य समारोह घोषित नहीं" व्युत्पन्न वर्ग

error C2509: 'render' : member function not declared in 'PlayerSpriteKasua' 

अब, क्या मुझे भ्रमित कर रहा है कि प्रस्तुत करना() परिभाषित किया गया है है, लेकिन विरासत में कक्षा में।

वर्ग परिभाषा इस तरह काम करता है:

class PlayerSpriteBase : public SpriteBase 
{ 
public: 
    virtual void pose() = 0; 
    virtual void knockback(bool Direction) = 0; 
    virtual int getHealth() = 0; 
}; 
:

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 यह है:

SpriteBase -Inherited By-> PlayerSpriteBase -Inherited By-> PlayerSpriteKasua 

तो, SpriteBase.h के एक मुकाबले डाउन संस्करण निम्न है

और अंत में, प्लेयरस्प्रिट Kasua.h यह है:

class PlayerSpriteKasua : public PlayerSpriteBase 
{ 
public: 
}; 

मुझे पता है कि इसमें अभी तक कोई सदस्य नहीं है, लेकिन ऐसा इसलिए है क्योंकि मुझे उन्हें जोड़ने के लिए नहीं मिला था। प्लेयरस्प्रिटबेस के लिए भी यही है; इसमें जाने के लिए बाकी चीजें बाकी हैं।

#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 ठीक के सभी सदस्यों को सूचीबद्ध पॉप अप होता है, लेकिन पर संकलन यह विफल रहता है जैसे मैं ने कहा:

PlayerSpriteKasua.cpp में कोड यह है ऊपर।

क्या कोई विशेष कारण है कि मुझे यह त्रुटि मिल रही है?

PlayerSpriteBase.cpp खाली है और अभी तक इसमें कुछ भी नहीं है।

SpriteBase.cpp SpriteBase के लिए कार्यशील परिभाषाएँ के बहुत सारे है, और PlayerSpriteKasua.cpp रूप में एक ही प्रारूप का उपयोग करता:

void SpriteBase::died() { 
    return; 
} 

एक उदाहरण है।

उत्तर

16

PlayerSpriteKasua.h में आपको जो भी तरीके ओवरराइड/कार्यान्वित करने जा रहे हैं, उन्हें फिर से घोषित करने की आवश्यकता है (बिना "= 0" कहने के लिए कि वे विधियां अब सार नहीं हैं)। तो आपको इसे निम्न प्रकार लिखना होगा:

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

... या आपने अपनी पोस्ट को कम रखने के लिए छोड़ दिया है?

+0

यह समस्या यहां है। मुझे नहीं पता था कि सी ++ ने खुद को सिखाया है। धन्यवाद! – Sukasa

+5

अच्छा! ध्यान दें कि आपको वास्तव में यहां "वर्चुअल" निर्दिष्ट नहीं करना है (यह इसके बिना ठीक काम करेगा) लेकिन इसे छोड़ना अच्छा अभ्यास है, क्योंकि यह बताता है कि जो भी आपका कोड पढ़ रहा है कि इन तरीकों को मूल कक्षाओं में से एक से विरासत में मिला है । – Ludovic

+2

मैं सी # पृष्ठभूमि से आया हूं और यह पागल है। यह DRY को तोड़ता है, खासकर यदि आपके पास एक ही काम करने की कई रणनीतियां हैं। –

2

आपको अपनी कक्षा परिभाषा में PlayerSpriteKasua :: render() के लिए एक घोषणा प्रदान करने की आवश्यकता है। अन्यथा, आपके PlayerSpriteKasua.h समेत अन्य अनुवाद इकाइयां यह बताने में सक्षम नहीं होंगे कि आप एक परिभाषा प्रदान करेंगे, और यह निष्कर्ष निकालने के लिए मजबूर होना होगा कि प्लेयरस्प्रिट कैसुआ को तत्काल नहीं किया जा सकता है।

2

आपको SpriteBase के सदस्यों को फिर से शुरू करने की आवश्यकता है जिसे आप PlayerSpriteKasua में PlayerSpriteKasua की घोषणा में PlayerSpriteKasua में लागू करने जा रहे हैं।

संबंधित मुद्दे