मैं सोच रहा हूं कि मुझे इस मामले में एक डिफ़ॉल्ट कन्स्ट्रक्टर घोषित करने की आवश्यकता क्यों है। एक बात के लिए अगर मैं इसे छोड़ देता हूं तो संकलक स्वचालित रूप से ऐसा नहीं करता है? और परवाह किए बिना, मैं अभी भी नहीं देखता कि इसकी आवश्यकता क्यों है। इसके अलावा, मुझे त्रुटि मिलती है भले ही मैं '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;
}
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;}
वैसे, आपको फ़ंक्शन परिभाषा पर अनुगामी अर्धविराम की आवश्यकता नहीं है।
यदि आप किसी वर्ग के लिए किसी भी ctors को परिभाषित नहीं करते हैं, तो कंपाइलर एक डिफ़ॉल्ट कंस्ट्रक्टर को संश्लेषित करेगा। यदि आप किसी अन्य कंस्ट्रक्टर को परिभाषित करते हैं (उदाहरण के लिए, जो तर्क लेता है) तो कंपाइलर आपके लिए एक को संश्लेषित नहीं करता है, और आपको स्वयं को परिभाषित करना होगा।
यदि आप परवाह करते हैं, तो C++ 0x एक "= डिफ़ॉल्ट;" जोड़ता है। संकलक को एक सीटीआर प्रदान करने के लिए घोषणा करने के लिए कि यह डिफ़ॉल्ट रूप से प्रदान किया गया होगा, भले ही आपने किसी अन्य सीटीआर को परिभाषित किया हो।
A
के लिए एक कॉपी कंस्ट्रक्टर को परिभाषित करने के लिए जिसे B
के लिए डिफॉल्ट कंस्ट्रक्टर की आवश्यकता नहीं है, सदस्य इनिशियलाइज़र सिंटैक्स का उपयोग करें:
class A {
public:
A(A const& origin) : obj_B(origin.obj_B) {}
//...
};
एक अंतिम बिंदु बनाने के लिए ...
यह मानते हुए कि आपने एक गैर-डिफ़ॉल्ट कंस्ट्रक्टर को परिभाषित नहीं किया था, एक डिफ़ॉल्ट कंस्ट्रक्टर को परिभाषित करने में विफल होने के परिणामस्वरूप theArray[] के तत्व अपरिभाषित हो जाते। यह एक बुरी आदत है जिसमें आमतौर पर सड़क पर कीड़े पड़ जाते हैं।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।