आप मुझे इसके लिए दोषी ठहरा सकते हैं। समिति ने बदलने की कोशिश की है (मुझे लगता है कि दो बार), लेकिन हर बार समाधान टूटने चीजों को खत्म कर दिया।
स्वैप और सैमसंग को स्थानांतरित करने के एक दशक बाद हमारे आई/ओ सिस्टम पर फिर से लगाया गया था। और यह पूरी तरह से साफ फिट नहीं था।
ध्यान दें कि basic_ios::swap
एक संरक्षित सदस्य फ़ंक्शन है और कोई नामस्थान-स्कोप संस्करण नहीं है। इस प्रकार इसे केवल व्युत्पन्न वर्ग (आमतौर पर आईट्रीम/ओस्ट्रीम) से बुलाया जा सकता है। ध्यान दें कि i/o_stream::swap
भी संरक्षित है और कोई नामस्थान-स्कोप संस्करण नहीं है। और उनका स्पेस बेस क्लास swap
पर कॉल करना है और फिर istream
में gcount
जैसे किसी स्थानीय डेटा को स्वैप करना है)।
अंततः string/filestream
स्तर पर आप जो भी "सामान्य" swap
पर विचार करेंगे: सार्वजनिक सदस्य और नामस्थान-स्कोप वेरिएंट। इस स्तर पर आपके पास डेटा सदस्य string/file buffer
(rdbuf
) और बेस क्लास है। इस स्तर पर swap
बस आधार और डेटा सदस्यों को स्वैप करता है।
यह सब की उलझी विशेषता यह है कि आधार वर्ग में नीचे rdbuf()
वास्तव में करने के लिए एक आत्म संदर्भित सूचक है व्युत्पन्न वर्ग के streambuf
(basic_filebuf
या basic_stringbuf
) और है यही कारण है कि आप आधार वर्ग नहीं करना चाहते इन आत्म-संदर्भ बिंदुओं को स्वैप करने के लिए।
यह आधार swap
अजीब बनाता है, लेकिन व्युत्पन्न ग्राहकों को छोड़कर हर कोई इसे सुरक्षित करता है। और व्युत्पन्न ग्राहक के swap
के लिए कोड बाद में भ्रामक रूप से सरल दिख रहा है। और व्युत्पन्न स्तर पर, swap
सार्वजनिक किया गया है और इस तरह व्यवहार करता है कि सार्वजनिक ग्राहक इसकी अपेक्षा करते हैं।
एक समान नृत्य कदम निर्माण के लिए बनाया जाता है और असाइनमेंट ले जाता है। ले जाएं निर्माण इस तथ्य से और जटिल है कि बेस क्लास वर्चुअल बेस है, और इस प्रकार इसके कन्स्ट्रक्टर को सबसे सीधे व्युत्पन्न वर्ग द्वारा नहीं कहा जाता है।
यह मजेदार था। यह अजीब लग रहा है। लेकिन यह अंततः काम करता है। ;-)
थोड़ा सा सुधार:
अल्बर्टो गणेश Barbati is responsiblei/ostream
स्तर पर swap
की रक्षा के लिए। यह उनके हिस्से पर एक बहुत अच्छी कॉल थी कि मैं अपने पहले डिजाइन के साथ पूरी तरह से चूक गया था।
स्रोत
2011-11-16 17:56:47
अल्फ पी। स्टीनबाक एक प्रश्न पूछ रहे हैं। अविश्वसनीय। : | – Nawaz
यह वास्तव में आश्चर्यजनक है। अगर मैं दो चीजों को स्वैप करता हूं तो मैं वास्तव में उन्हें स्वैप करने की उम्मीद करता हूं; अगर मुझे एक बग मिले और पाया कि यह 'rdbuf' को स्वैप नहीं कर रहा था, तो मुझे लगता है कि यह एक कार्यान्वयन बग था। – GManNickG
वास्तव में आश्चर्यजनक आश्चर्यजनक। मैंने पहले फाइनल ड्राफ्ट की जांच की थी (एन 30 9 2) और यह वही है। मुझे आश्चर्य है कि यह सी ++ 03 में समान था, शायद एक विरासत अवशेष? –