2011-03-31 14 views
15

मेरा प्रश्न सरल है। हमें डिफॉल्ट कन्स्ट्रक्टर की आवश्यकता कब होती है? कृपया नीचे दिए गए कोड का संदर्भ लें:हमें एक डिफ़ॉल्ट कन्स्ट्रक्टर कब चाहिए?

class Shape 
{ 
    int k; 

public: 
    Shape(int n) : k(n) {} 
    ~Shape() {} 
}; 

class Rect : public Shape 
{ 
    int l; 

public: 
    Rect(int n): l(n) 
    {}  //error C2512: 'Shape' : no appropriate default constructor available 

    ~Rect() {} 
}; 
  1. क्यों संकलक वर्ग रेक्ट में परोक्ष शून्य तर्क डिफ़ॉल्ट निर्माता नहीं पैदा कर रहा?

  2. मेरे ज्ञान के अनुसार, यदि एक वर्ग (आयत) किसी अन्य वर्ग (आकार) से लिया गया है जिसमें डिफ़ॉल्ट कन्स्ट्रक्टर (या तो अंतर्निहित रूप से जेनरेट या स्पष्ट रूप से प्रदान किया गया है), तो डिफ़ॉल्ट कन्स्ट्रक्टर को संकलक द्वारा उत्पन्न किया जाना चाहिए।

+0

वह हिस्सा कहां है जहां आप रेक्ट ऑब्जेक्ट बनाते हैं और इसका उपयोग करते हैं? शायद आप इसे 'रेक्ट आरईसी' की तरह बनाते हैं; जो एक डिफ़ॉल्ट contructor की जरूरत है। – RvdK

+0

आईआईआरसी यदि आप एक निर्माता को निर्दिष्ट नहीं करते हैं तो संकलक आपके लिए एक डिफ़ॉल्ट बना देगा। लेकिन अगर आप एक निर्दिष्ट करते हैं तो इसमें केवल एक ही होगा। – RvdK

+0

ctor == निर्माता ... आह! –

उत्तर

16

यदि आपने तर्क के साथ अपना स्वयं का कन्स्ट्रक्टर बनाया है तो एक डिफ़ॉल्ट कन्स्ट्रक्टर संश्लेषित नहीं किया जाता है। जब से तुम Shape अपनी खुद की एक निर्माता दिया था, आप स्पष्ट रूप से अब एक डिफ़ॉल्ट Shape निर्माता को लिखने के लिए होगा:

class Shape 
{ 
     int k; 

    public: 
     Shape() : k(0) {} 
     Shape(int n) : k(n) {} 
     ~Shape() {} 
}; 

(आप खाली ~Rect() {} परिभाषाएँ बाहर छोड़ सकते हैं, के रूप में इन संश्लेषित किया जाएगा।)

हालांकि, मुझे लगता है कि आप आकार के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर चाहते हैं। Rect ठीक से Shape आधार का निर्माण है:

class Shape 
{ 
     int area; // I've had to guess at what this member means. What is "k"?! 

    public: 
     Shape(int n) : area(area) {} 
}; 

class Rect : public Shape 
{ 
    int l; 

    public: 
    Rect(int l, int w) : Shape(l*w), l(l), w(w) {} 
}; 

भी ध्यान रखें कि इस उदाहरण oft cited as an abuse of OO है।इस बात पर विचार करें कि क्या आप वास्तव में यहां विरासत की आवश्यकता है।

+0

@ शममेल: क्षमा करें कि उन सभी समीक्षकों ने आपके संपादन को खारिज कर दिया; मुझे नहीं पता कि उन्होंने ऐसा क्यों किया। यदि आप फिर से संपादन का सुझाव देना चाहते हैं तो मैं इसे स्वीकार करूंगा। धन्यवाद! –

11

एक डिफ़ॉल्ट कन्स्ट्रक्टर केवल संकलक द्वारा स्वचालित रूप से जेनरेट किया जाएगा यदि कोई अन्य रचनाकार परिभाषित नहीं किया गया है। किसी भी विरासत के बावजूद।

और यह भी आपको कॉल करके अपने आधार वर्ग का निर्माण करने की जरूरत है:

Rect(int n) : Shape(n), l(n) 
{ 
} 
0

डिफ़ॉल्ट निर्माता उत्पन्न होता है केवल यदि आप किसी अन्य कंस्ट्रक्टर परिभाषित नहीं किया है।

माना जाता है कि, यदि आपको कक्षा में कुछ विशेष प्रारंभिकरण की आवश्यकता है, तो डिफ़ॉल्ट कन्स्ट्रक्टर सही काम नहीं करेगा।

1

संकलक एक डिफ़ॉल्ट सीटीआर परिभाषित करेगा यदि केवल और यदि आप स्पष्ट रूप से किसी भी ctors घोषित नहीं करते हैं।

ध्यान दें कि कन्स्ट्रक्टर घोषित करना महत्वपूर्ण नहीं है, इसे आवश्यक रूप से परिभाषित नहीं करना चाहिए। उदाहरण के लिए, यह एक सामान्य सीटीआर घोषित करने के लिए काफी आम है, और संकलक को किसी अन्य को परिभाषित करने से रोकने के लिए इसे कभी परिभाषित नहीं करता है।

संपादित करें: यह भी ध्यान दें कि सी ++ 11 में आपके जैसे परिस्थितियों से निपटने के लिए =default वाक्यविन्यास है।

2

सी ++ WRT कंस्ट्रक्टर्स से भरा व्यवहार के लिए यह देखें: http://en.wikipedia.org/wiki/Default_constructor

सरल जवाब है कि अगर आप एक निर्माता निर्दिष्ट करते हैं, संकलक आप के लिए एक डिफ़ॉल्ट एक नहीं बना जाएगा।

यह नियम जावा पर भी लागू होता है।

0

जैसा कि आपने एक पूर्णांक की अपेक्षा करने वाले आकार के लिए एक निर्माता को परिभाषित किया है, आपने ऐसा करके डिफ़ॉल्ट कन्स्ट्रक्टर को अधिलेखित किया है। तो यदि आप आकार बढ़ाते हैं तो आपको सुपरक्लास के लिए एक पूर्णांक मान पास करना होगा।

0

कंपाइलर किसी भी कन्स्ट्रक्टर को परिभाषित नहीं करते समय डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न करता है। लेकिन अगर आपने किसी भी निर्माता को परिभाषित किया है जो कुछ तर्क लेता है या नहीं। कंपाइलर उस कन्स्ट्रक्टर का उपयोग करेगा और शून्य तर्क के साथ डिफ़ॉल्ट कन्स्ट्रक्टर उत्पन्न नहीं करेगा।

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