2010-12-08 17 views
6

पर मूल्य के रूप में पारित किया जा सकता है। मुझे इस बारे में कुछ भ्रम है कि "क्या ऑब्जेक्ट कॉपी कॉपी कन्स्ट्रक्टर के मूल्य के रूप में पारित किया जा सकता है" कंपाइलर स्पष्ट रूप से इसे अस्वीकार करता है, जिसका अर्थ है कि यह संभव नहीं है। क्या आप इसे समझने में मेरी सहायता कर सकते हैं?क्या कोई ऑब्जेक्ट कॉपी कन्स्ट्रक्टर

class Dummy{ 
    Dummy(Dummy dummy){ // This is not possible 
    } 
}; 

तो यह क्यों कहा जाता है कि "जब मूल्य द्वारा पारित किया जाता है की प्रतिलिपि निर्माता पुनरावर्ती कॉल करने के लिए नेतृत्व करेंगे।"

+0

@ कोस - मैं असहमत हूं। लोगों को * सही * उत्तर स्वीकार करना चाहिए, न कि उनके पसंदीदा। –

+0

अच्छा बिंदु! :-) इसे "आपके पसंदीदा सही उत्तरों" को पढ़ना चाहिए था। – Kos

+2

वैसे मैं न्याय करने का कोई विशेषज्ञ नहीं हूं कि सही उत्तर कौन सा है। हालांकि, जो मुझे अपील करता है वह सबसे अधिक संभावना है जिसे सही के रूप में चुना जाएगा। – Zuzu

उत्तर

12

ऐसा इसलिए है क्योंकि मूल्य से गुजरने के लिए, आपको COPY ऑब्जेक्ट की आवश्यकता है। इसलिए, आप इसे कॉपी करने की परिभाषा में, वस्तु की एक प्रति में गुजर रहे हैं।

प्रभावी रूप से क्या होता है यदि यह जाल नहीं होता है, तो क्या आपकी प्रतिलिपि निर्माता प्रतिलिपि बनाने के लिए आपकी प्रतिलिपि निर्माता को कॉल करेगा, जो प्रतिलिपि बनाने के लिए आपकी प्रतिलिपि निर्माता को कॉल करेगा, जो आपकी प्रतिलिपि बनाने के लिए आपकी प्रतिलिपि निर्माता को कॉल करेगी ...

+0

लेकिन संकलक एक सीटीओआर के पैरामीटर के रूप में मान द्वारा पास की अनुमति नहीं देता है, फिर जहां कॉपीिंग तस्वीर में आती है। अभी भी यह नहीं मिल सकता है। – Zuzu

+1

@Zuzu: यही कारण है कि आपके पास एक कॉपी कन्स्ट्रक्टर नहीं हो सकता है जो इसके पैरामीटर को मूल्य से लेता है: इस अनंत रिकर्सन के कारण कॉल करना असंभव होगा। –

+1

@Zuzu: * अगर * इसे अनुमति दी गई थी, * फिर * रिकर्सन होगा। उस hypothetical रिकर्सन को रोकने के लिए, यह अस्वीकृत है। –

5

सं

त्रुटि का कहना है, यह प्रति निर्माता की पुनरावर्ती कॉल करने के लिए नेतृत्व करेंगे। कॉपी कन्स्ट्रक्टर का उपयोग ऑब्जेक्ट की प्रतिलिपि बनाने के लिए किया जाता है। जब आप मूल्य से पारित होते हैं तो आपको ऑब्जेक्ट की एक प्रति बनाने की आवश्यकता होती है।

तो, अगर आप इस तरह के एक निर्माता हो सकता था, तो आप वस्तु आप प्रतिलिपि निर्माता, अनंत तक के पास कॉपी करने के लिए प्रतिलिपि निर्माता आह्वान करने के लिए की आवश्यकता होगी।

4

जब एक पैरामीटर मान द्वारा दिया जाता है, संकलक पहले एक वस्तु की नकल करने के लिए (क्रम में उदाहरण है, जिसमें तर्क हो जाएगा बनाने) की जरूरत है। तो आपकी कॉपी कन्स्ट्रक्टर को कॉल करने के लिए, कंपाइलर को ऑब्जेक्ट की एक प्रति अग्रिम में बनाना होगा।

आमतौर पर प्रति कंस्ट्रक्टर्स इस तरह से परिभाषित कर रहे हैं:

Dummy(const Dummy& dummy) 
{ 
    // This is possible 
} 

इस तरह, आप निर्माता के लिए वस्तु की एक अलग कॉपी नहीं मांगते, तो आप सिर्फ एक मौजूदा प्रतिलिपि के लिए एक संदर्भ देना (और उस प्रति को भी बदलने की वादा नहीं)।

1

तो यह क्यों कहा जाता है कि "जब मूल्य द्वारा पारित किया जाता है की प्रतिलिपि निर्माता पुनरावर्ती कॉल करने के लिए नेतृत्व करेंगे।"

क्योंकि क्रम मूल्य द्वारा कि प्रति निर्माता के लिए एक वस्तु पारित करने के लिए, आप की जरूरत हो सकती यह पहली कॉपी-निर्माण (क्योंकि पारित कर-दर-value पैरामीटर मूल वस्तु पारित कर दिया की अस्थायी प्रतिलिपि है)।

5

मानक विशेष रूप से कहते हैं (12.1/10 कंस्ट्रक्टर्स):

एक दसवीं कक्षा के लिए एक प्रति निर्माता प्रकार एक्स & की या प्रकार स्थिरांक की एक्स &

पहली बार एक पैरामीटर के साथ एक निर्माता है

तो यह एक मान पैरामीटर नहीं ले सकता है - यह एक संदर्भ होना चाहिए।

आपको लगता है के बारे में है, तो एक पल के लिए, यह स्पष्ट हो क्यों करना चाहिए: एक मूल्य पैरामीटर पारित करने के लिए, संकलक एक प्रतिलिपि बनाने चाहिए ... यह ऐसा करने के लिए प्रतिलिपि निर्माता आह्वान करने के लिए की जरूरत है।

+0

क्या आप – Zuzu

+0

उदाहरण के साथ मुझे समझने में मदद कर सकते हैं शायद ऑरेंजोक्टोपस के उत्तर में उदाहरण कुछ ऐसा हो सकता है जो आपको समझने में मदद करता है। –

1

हालांकि उत्तर पहले से ही दिया गया था, मैं बस स्पष्ट करना चाहता था, क्योंकि मैं वही प्रश्न दोहराता हूं। Dummy(Dummy dummy); एक कॉपी निर्माता नहीं है। कॉपी कन्स्ट्रक्टर या तो Dummy(const Dummy&); या Dummy(Dummy&); का हो सकता है मूल मूल मानक द्वारा स्पष्ट रूप से प्रतिबंधित है।

तो फिर तुम पूछ रहे हैं:

तो फिर यह कहा जाता है कि "जब मूल्य द्वारा पारित किया जाता है कॉपी निर्माता पुनरावर्ती कॉल करने के लिए नेतृत्व करेंगे।"

डायग्नोस्टिक संदेश मानक द्वारा अनिवार्य नहीं है, बल्कि आपके कंपाइलर ने यह शब्द समझाया कि यह संभवतः क्यों काम नहीं कर सका।

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