मैं सोच रहा हूं कि मुझे इस मामले में एक डिफ़ॉल्ट कन्स्ट्रक्टर घोषित करने की आवश्यकता क्यों है। एक बात के लिए अगर मैं इसे छोड़ देता हूं तो संकलक स्वचालित रूप से ऐसा नहीं करता है? और परवाह किए बिना, मैं अभी भी नहीं देखता कि इसकी आवश्यकता क्यों है। इसके अलावा, मुझे त्रुटि मिलती है भले ही मैं 'obj_B = origin.obj_B;' को छोड़ दूं।

class B
{
public:
    bool theArray[5] ;

    B(bool x) {theArray[1] = x;};
    //B(){};    
};

class A
{
public:
    B obj_B;

    A() : obj_B(1) {};
    A(A const &origin) {obj_B = origin.obj_B;}; //error:no matching function for call 
                                                      //to B::B()
}; 

int main () 
{
    std::vector <A> someAs;
    for(int q=0;q<10;q++)
        someAs.push_back(A());

    for(int q=0;q<10;q++)
        std::cout << someAs[q].obj_B.theArray[1] << std::endl;
}
0
Matt Munson 21 फरवरी 2011, 06:23

4 जवाब

सबसे बढ़िया उत्तर

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

क्योंकि आपने बनाया है:

B(bool x) {theArray[1] = x;}

आपके लिए डिफ़ॉल्ट कंस्ट्रक्टर नहीं बनाया जाएगा।

आपको जो विशिष्ट त्रुटि मिल रही है, वह इसलिए है क्योंकि A(A const &origin) स्पष्ट रूप से obj_B के लिए उपयोग करने के लिए कंस्ट्रक्टर को निर्दिष्ट नहीं करता है।

निम्नलिखित कोड काम करेगा:

A(A const &origin) : obj_B(1) {obj_B = origin.obj_B;}

वैसे, आपको फ़ंक्शन परिभाषा पर अनुगामी अर्धविराम की आवश्यकता नहीं है।

6
Wheatevo 21 फरवरी 2011, 06:35

यदि आप किसी वर्ग के लिए किसी भी ctors को परिभाषित नहीं करते हैं, तो कंपाइलर एक डिफ़ॉल्ट कंस्ट्रक्टर को संश्लेषित करेगा। यदि आप किसी अन्य कंस्ट्रक्टर को परिभाषित करते हैं (उदाहरण के लिए, जो तर्क लेता है) तो कंपाइलर आपके लिए एक को संश्लेषित नहीं करता है, और आपको स्वयं को परिभाषित करना होगा।

यदि आप परवाह करते हैं, तो C++ 0x एक "= डिफ़ॉल्ट;" जोड़ता है। संकलक को एक सीटीआर प्रदान करने के लिए घोषणा करने के लिए कि यह डिफ़ॉल्ट रूप से प्रदान किया गया होगा, भले ही आपने किसी अन्य सीटीआर को परिभाषित किया हो।

2
Jerry Coffin 21 फरवरी 2011, 06:30

A के लिए एक कॉपी कंस्ट्रक्टर को परिभाषित करने के लिए जिसे B के लिए डिफॉल्ट कंस्ट्रक्टर की आवश्यकता नहीं है, सदस्य इनिशियलाइज़र सिंटैक्स का उपयोग करें:

class A {
public:
    A(A const& origin) : obj_B(origin.obj_B) {}
    //...
};
2
aschepler 21 फरवरी 2011, 06:36

एक अंतिम बिंदु बनाने के लिए ...

यह मानते हुए कि आपने एक गैर-डिफ़ॉल्ट कंस्ट्रक्टर को परिभाषित नहीं किया था, एक डिफ़ॉल्ट कंस्ट्रक्टर को परिभाषित करने में विफल होने के परिणामस्वरूप theArray[] के तत्व अपरिभाषित हो जाते। यह एक बुरी आदत है जिसमें आमतौर पर सड़क पर कीड़े पड़ जाते हैं।

0
Lou 21 फरवरी 2011, 07:32