2016-09-02 17 views
17

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

यहाँ इस वर्णन करने के लिए एक छोटी सी उदाहरण है:

struct A { 
public: 
     A() = delete; 
     A(A const&) = delete; 
     A(A &&a) {} 
}; 

struct B { 
     A a; 
     B() = delete; 
     B(B const&) = delete; 
     B(B &&b) {} 
}; 

इस संकलित करने के लिए कोशिश कर रहा है, मैं:

move_without_default.cc: In constructor ‘B::B(B&&)’: 
move_without_default.cc:15:11: error: use of deleted function ‘A::A()’ 
    B(B &&b) {} 
     ^
move_without_default.cc:6:2: note: declared here 
    A() = delete; 
^

क्यों यह एक त्रुटि है? इसके चारों ओर किसी भी तरह से?

+8

'{}' '= default;' – cpplearner

+0

को प्रतिस्थापित करें क्योंकि 'ए' का डिफ़ॉल्ट कन्स्ट्रक्टर हटा दिया गया है लेकिन 'बी' इसका उपयोग करता है। – tkausl

+6

एक खाली चालक कन्स्ट्रक्टर स्वचालित रूप से सदस्य-दर-सदस्य कदम करने की कोशिश नहीं करेगा। आपका चालक कन्स्ट्रक्टर डिफ़ॉल्ट रूप से 'ए' बनाने की कोशिश कर रहा है, इसे स्थानांतरित नहीं करता है। – user2357112

उत्तर

17

A सदस्य को आरंभ करने के लिए निर्माता की प्रारंभिक सूची का उपयोग करें। लिखित के रूप में, चालक का उपयोग करता है, क्योंकि संकलक कहते हैं, A के लिए डिफ़ॉल्ट कन्स्ट्रक्टर।

B(B&& b) : a(std::move(b.a)) {} 
9

सामान्य रूप से एक चालक कन्स्ट्रक्टर को डिफ़ॉल्ट प्रारंभिकरण प्रदान नहीं करना पड़ता है। आपका चालक चलता है।

एक चालक कन्स्ट्रक्टर अभी भी कन्स्ट्रक्टर है। और इसलिए, यह सभी subobjects शुरू करना होगा। यदि आप स्पष्ट प्रारंभिकरण प्रदान नहीं करते हैं, तो यह डिफ़ॉल्ट रूप से उन्हें प्रारंभ करने का प्रयास करेगा। और यदि यह ऐसा नहीं कर सकता है, तो आपको एक त्रुटि मिलती है।

तो आप या तो उन्हें प्रारंभ कर सकते हैं (शायद b से आगे बढ़ रहे हैं), या बस अपने चालक के साथ = default का उपयोग करें और संकलक को यह काम करने दें।

23

चालक कन्स्ट्रक्टर को अपने सदस्यों के लिए डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता क्यों होती है?

चाल निर्माता अपने द्वारा निर्धारित एक सदस्य डिफ़ॉल्ट-निर्माण करती है। यदि आप किसी भी सदस्य को डिफॉल्ट बनाते हैं, तो उन सदस्यों के लिए डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता होती है।

एक कन्स्ट्रक्टर (यह नियमित, प्रतिलिपि या स्थानांतरित हो) डिफ़ॉल्ट रूप से उन सदस्यों को प्रारंभ करता है जो सदस्य प्रारंभिक सूची में सूचीबद्ध नहीं हैं और न ही डिफ़ॉल्ट सदस्य प्रारंभिकता है। B::a चालक कन्स्ट्रक्टर की सदस्य प्रारंभिक सूची में नहीं है (इसमें प्रारंभिक सूची नहीं है) और इसमें कोई डिफ़ॉल्ट सदस्य प्रारंभिकता नहीं है।

इसके आसपास कोई रास्ता? सदस्यों

B(B&&) = default; 

डिफ़ॉल्ट चाल निर्माता चाल-निर्माण करती है:

अधिकांश बस, डिफ़ॉल्ट चाल निर्माता का उपयोग करें।

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

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