2010-11-28 12 views
16

के रूप में घोषित नहीं किया जा सकता है मुझे संकलन पर यह त्रुटि मिलती है -> क्षेत्र एम 1 :: एससी को अमूर्त प्रकार I1 के रूप में घोषित नहीं कर सकता क्योंकि निम्न वर्चुअल फ़ंक्शन I1 के भीतर शुद्ध हैं। कृपया मदद करे।सी ++: क्षेत्र को अमूर्त प्रकार

class I1 
    {  
    public: 
     virtual void a(int dir) = 0; 
     virtual void b() = 0; 
     virtual void c() = 0; 

     void a(int dir) { 
     .... 
     } 

     void b() { 
     .... 
     } 

     void c() { 
     .... 
     } 
    }; 

    class I2 : public I1 
    {  
    public: 


     void a(int dir) { 
     .... 
     } 

     void b() { 
     .... 
     } 

     void c() { 
     .... 
     } 
    }; 

    class M1 : public G1 
    { 
    protected: 
    I1 sc; 
    public: 
     int dir = 4; 
     sc.a(dir); 
    }; 

पूरा कोड http://pastebin.com/PFrMTJuF पर पाया जा सकता है।

उत्तर

13

Abstract classes तत्काल नहीं किया जा सकता है, लेकिन आप के प्रत्येक उदाहरण में I1 के उदाहरण को एम्बेड करके संकलक से ऐसा करने के लिए कह रहे हैं।

आप के आसपास काम कर सकते हैं कि थोड़ा अपने डिजाइन बदल रहा है और एक सूचक embedding (या एक स्मार्ट सूचक, अगर आप उन का उपयोग कर सकते हैं) के बजाय I1 की आवृत्ति द्वारा:

class M1 : public G1 
{ 
protected: 
    I1 *sc; 
public: 
    M1(I1 *sc_) { 
     sc = sc_; 
    } 
    void foo() { 
     int dir = 4; 
     sc->a(dir); 
    } 
}; 

संपादित करें: अपना कोड पढ़ने के बाद, मुझे लगता है कि आपकी समस्या का समाधान करने का सबसे सरल और साफ तरीका वर्तमान कक्ष को Execute() आपके आदेश की विधि को पास करना है, उदाहरण के लिए कुछ ऐसा:

class ICommand 
{ 
public: 
    virtual ~ICommand() 
    { 
    } 

    virtual void Execute(Room *room) = 0; 
}; 


class MoveCommand : public GameCommand 
{ 
public: 
    MoveCommand() 
    { 
    } 

    void Execute(Room *room) 
    { 
     // Do something with `room`... 
    } 
}; 


void Game::HandleInput() 
{ 
    // Read command from user and generate a command object from it. 
    ICommand *pCommand = ParseCommand(Input::ReadCommand()); 
    if (pCommand) { 
     pCommand->Execute(GetCurrentRoom()); // Pass current room to command. 
     delete pCommand; 
    } 
} 
+0

sc_ क्या प्रतिनिधित्व करता है? क्या मैं इसका इस्तेमाल उसी तरह कर सकता हूं? – user522767

+0

@user, 'sc_' एक निर्माता पैरामीटर है, जिसे 'एम 1' का उदाहरण बनाने के लिए आवश्यक है। मेरे उदाहरण में, इसे 'I1' से व्युत्पन्न एक ठोस वर्ग के उदाहरण और 'ए()', 'बी()' और 'सी()' के कार्यान्वयन को इंगित करना चाहिए। जैसे 'I2' का एक उदाहरण काम करेगा। –

+0

क्या मैं आपको अपना कोड भेज सकता हूं? मैं सी ++ में नया हूं और मैं वास्तव में सबकुछ का वर्णन नहीं कर सकता क्योंकि मेरे पास मेरे प्रोजेक्ट में कुछ फाइलें हैं जो एक साथ जुड़े हुए हैं। – user522767

7

I1 एक सार वर्ग है क्योंकि इसमें पूरी तरह वर्चुअल फ़ंक्शन (= परिभाषा के बिना कार्य) हैं।

आप अमूर्त वर्गों के उदाहरण नहीं बना सकते हैं (क्योंकि वे कैसे काम करेंगे ?!), इसलिए I1 a जैसी घोषणा नहीं है।

प्रश्न के आपके संपादन के बाद ऐसा लगता है कि I1 एक सार वर्ग नहीं होना चाहिए, क्योंकि आपने विधियों के लिए परिभाषाएं प्रदान की हैं। यदि ऐसा है, तो कोड कार्य करने के लिए अपनी विधि घोषणाओं के बाद बस = 0 हटा दें।

+0

मैं क्या कर सकता हूं? कृपया सलाह दें। – user522767

+1

एक (स्मार्ट) पॉइंटर का उपयोग करना एक आम कामकाज है। जब आप उस पॉइंटर को प्रारंभ करते हैं, तो आप एक गैर-सारणी व्युत्पन्न कक्षा का उदाहरण बनाते हैं। सूचक निश्चित रूप से अधिक सामान्य (लेकिन अमूर्त) मामले में रहता है। यह मान्य है क्योंकि वास्तविक उदाहरण विधि कार्यान्वयन प्रदान करता है - भले ही सूचक प्रकार यह नहीं जानता कि कौन से कार्यान्वयन लागू होते हैं, जिसे रन-टाइम पर निर्धारित किया जा सकता है। – Steve314

+0

क्या मैं आपको अपना कोड भेज सकता हूं? मैं सी ++ में नया हूं और मैं वास्तव में सबकुछ का वर्णन नहीं कर सकता क्योंकि मेरे पास मेरे प्रोजेक्ट में कुछ फाइलें हैं जो एक साथ जुड़े हुए हैं। – user522767

1

आप अमूर्त वर्ग (कक्षा जिसमें एक या अधिक शुद्ध वर्चुअल फ़ंक्शन हैं) के लिए उदाहरण नहीं बना सकते हैं। इसके अलावा एक और समस्या है। कक्षा घोषणा में फ़ंक्शन sc.a(dir) पर कॉल करते समय आप संकलक को क्या करना चाहते हैं? लाइन dir = 4 भी गलत है, वर्ग की स्थाई कॉन्स सदस्यों को कक्षा घोषित करने में प्रारंभ किया जा सकता है।

+0

वास्तव में, यह int dir = उत्तर होगा; जहां एनओआरटीएच को एनआईएम कक्ष {ईएएसटी, वेस्ट, साउथ, नॉर्थ} में वैश्विक चर के रूप में शामिल फ़ाइलों में से एक में परिभाषित किया गया है – user522767

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