2010-03-02 19 views

उत्तर

10

std::stack (सभी एसटीएल कंटेनर की तरह) की आवश्यकता है कि अपने निहित प्रकार "आबंटित" हो। एसटीएल-स्पीच में, इसका मतलब है कि इसमें एक कॉपी कन्स्ट्रक्टर और operator= होना चाहिए। std::ifstream इनमें से कोई भी नहीं है।

आप कल्पना कर सकते कारण है कि आप को कॉपी करें और आवंटित आई/ओ धाराओं करने में सक्षम हो नहीं करना चाहेंगे; उसी धारा के दो प्रतियां होने पर क्या होना चाहिए इसके अर्थशास्त्र स्पष्ट नहीं हैं। क्या एक प्रतिलिपि से पढ़ना या लिखना चाहिए दूसरी प्रतिलिपि की स्थिति को प्रभावित करना चाहिए? एक धारा को बंद करना चाहिए दूसरे को बंद करना चाहिए? इत्यादि

यदि आप "std::ifstream एस का कंटेनर" रखना चाहते हैं, तो आपको वास्तव में क्या करना चाहिए "std::ifstream* एस का कंटेनर" है। गैर-कॉन्स पॉइंटर्स हमेशा असाइन किए जाते हैं। चेतावनी यह है कि इस मामले में आपको यह सुनिश्चित करना होगा कि कंटेनर को नष्ट करने से पहले आप पॉइंटर्स को स्वयं हटा दें, क्योंकि कंटेनर आपके लिए ऐसा नहीं करेगा।

+0

हालांकि, आपके पास ifstream सूचक का ढेर हो सकता है: std :: stacked s; – ALOToverflow

+0

बकाया! धन्यवाद। - प्रसून –

0

टायलर का बैक अप यहां (+1 वोट करने के बाद)।

STL कंटेनरों सभी वस्तुओं आप उन्हें देने के स्थान पर अधिक प्रतियां हैं। यदि आप चाहते हैं, तो आप सावधानीपूर्वक तैयार किए गए प्रतिलिपि बनाने वालों और संदर्भ गणना और क्या नहीं के साथ विनाशकों के साथ विशेष वस्तुओं को देकर इसका सामना कर सकते हैं।

आम तौर पर, मुझे लगता है कि इस तरह से बहुत अधिक परेशानी है। अंगूठे के नियम के रूप में, केवल कंटेनरों में छोटी वस्तुओं का उपयोग करें। यदि आप संरचनाओं या कक्षाओं का ढेर बनाना चाहते हैं, तो इसके बजाय पॉइंटर्स का उपयोग करें।

+0

अंगूठे के मेरे नियम के रूप में: 1) केवल सदस्यों की रचना (उच्च स्तरीय) कक्षाएं जो उचित रूप से प्रतिलिपि लागू करती हैं (जैसे 'std :: string',' char * 'नहीं), 2) अन्य स्मार्ट पॉइंटर्स स्टोर करें (और बनाएं सुनिश्चित करें कि वर्ग गैर-प्रतिलिपि योग्य है)। – UncleBens

+0

भले ही आप # 1 करते हैं, मेरे (आमतौर पर वास्तविक समय) काम में, बड़ी वस्तुओं को प्रतिलिपि बनाना, या कुछ भी जो गतिशील आवंटन/डीलोकेशन शामिल कर सकता है, एक बुरी बात है। –

+0

ऐसे मामले में आप शायद विशेष मेमोरी पूल आदि का उपयोग करते हैं (क्योंकि आप गतिशील रूप से पॉइंटर्स आवंटित नहीं कर सकते हैं) जो सी ++ के विशिष्ट उपयोग के लिए बनाता है। क्या आप वास्तव में 'वेक्टर ' के पक्ष में 'वेक्टर ' से बचने के लिए शुरुआत करने के लिए अच्छी सलाह मानेंगे? आईएमओ, ओवरहेड सामान्य रूप से महत्वपूर्ण नहीं है, बहुत विशिष्ट परिदृश्यों को छोड़कर। – UncleBens

2

क्योंकि धाराओं गैर copyable हैं आप tecxhnicaly मानक कंटेनर में उन्हें रख सकते हैं।

लेकिन हम पॉइंटर्स को स्ट्रीम में स्टोर करके इसके आसपास जा सकते हैं। लेकिन आप मानक कंटेनर में पॉइंटर्स को धाराओं (विशेष रूप से यदि वे गतिशील रूप से आवंटित किए जाते हैं) को स्टोर नहीं करना चाहते हैं। तो हम एक समाधान के लिए बढ़ावा देने के लिए देखो।

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

क्योंकि सूचक कंटेनर स्वामित्व आप डॉन लेता है; टी ऑब्जेक्ट को हटाने के बारे में चिंता करने की जरूरत। कंटेनर ऐसा करेगा।

क्योंकि यह पॉइंटर्स की बजाय ऑब्जेक्ट्स के रूप में निहित वस्तुओं तक पहुंच प्रदान करता है, यह आपको एक अधिक प्राकृतिक फ़ैशन (पॉइंटर्स के कंटेनर के साथ कैंपर्ड) में मानक एल्गोरिदम में स्ट्रीम का उपयोग करने की अनुमति देता है।

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