2010-12-04 30 views
10

मैं मेरी समस्या कम हो गया है कि निम्न उदाहरण कोड के लिए नीचे:डिफ़ॉल्ट निर्माता

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n); 
}; 

MewTwo::MewTwo(int n) {} 

कौन सा एक त्रुटि पैदा करता है:

no matching function for call to ‘pokemon::pokemon()’

मैं क्या सोचते हो रहा है वह यह है कि जब मैं MewTwo कन्स्ट्रक्टर लिखने की कोशिश करता हूं, तो पॉकेटम के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर कहा जाता है, जो अस्तित्व में नहीं है। मैं सी ++ के लिए अपेक्षाकृत नया हूं इसलिए मैं बस अनुमान लगा रहा हूं। कोई विचार?

संयम: फ़िक्स कक्षाओं में सार्वजनिक सदस्यों को संशोधित या जोड़ नहीं सकते हैं।

उत्तर

13

वास्तव में क्या आप देख रहे हैं सदस्य प्रारंभ सूची है। निम्नलिखित करने के लिए अपने विरासत में मिला वर्ग निर्माता बदलें:

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) : pokemon(n) {} 
}; 

आप की पहचान क्या हो रहा था में सही थे। असल में जब आप विरासत वर्ग बनाते हैं तो आप पहले बेस क्लास बनाते हैं और आप ऐसा नहीं कर सकते क्योंकि कोई डिफ़ॉल्ट कन्स्ट्रक्टर परिभाषित नहीं होता है। सदस्य प्रारंभिक सूचियां आपको उस चारों ओर पाने में मदद करती हैं :)

अधिक उदाहरण के लिए: http://www.cprogramming.com/tutorial/initialization-lists-c++.html देखें!

+1

मैंने सदस्य प्रारंभिक सूचियों के बारे में कभी नहीं सुना है, लिंक के लिए धन्यवाद, अब यह सही समझ में आता है! :) – Coltin

5

इस प्रयास करें:

class pokemon{ 
    public: 
     pokemon(int n); 
}; 

class MewTwo : public pokemon { 
    public: 
     MewTwo(int n) :pokemon(n){} 
}; 
+4

+1। बेस क्लास और सदस्यों को व्युत्पन्न वर्ग 'कन्स्ट्रक्टर कोड रन से पहले प्रारंभ किया जाता है। यदि आप इस उद्देश्य के लिए डिफ़ॉल्ट कन्स्ट्रक्टर का उपयोग नहीं करना चाहते हैं, तो आपको यह निर्दिष्ट करना होगा कि किस कन्स्ट्रक्टर का उपयोग करना है और कौन से पैरामीटर पास होंगे। यह दिखाए गए अनुसार प्रारंभिक सूची के साथ किया जाता है। बेस क्लास में, आपने एक कन्स्ट्रक्टर को परिभाषित किया है, जो एक डिफ़ॉल्ट कन्स्ट्रक्टर के निर्माण को दबा देता है। –

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