बस एक वैचारिक सवाल जिसे मैं चला रहा हूं। मेरे वर्तमान प्रोजेक्ट में ऐसा लगता है कि मैं बूस्ट smart_ptr
और ptr_container
लाइब्रेरीज़ का उपयोग कर रहा हूं। मैं कई अलग-अलग ऑब्जेक्ट्स में boost::ptr_vectors
बना रहा था और कुछ पॉइंटर्स को boost::ptr_vector
से दूसरे स्थानांतरित करने के लिए स्थानांतरण() विधि को कॉल कर रहा था।को बढ़ावा देना चाहिए :: ptr_vector जगह std :: vector में हर समय इस्तेमाल किया जाना चाहिए?
यह मेरी समझ है कि स्पष्ट रूप से ढेर आवंटित वस्तुओं के स्वामित्व को दिखाने के लिए महत्वपूर्ण है।
मेरा सवाल यह है कि, किसी ऑब्जेक्ट से संबंधित ढेर-आवंटित सदस्यों को बनाने के लिए इन बूस्ट लाइब्रेरीज़ का उपयोग करना वांछनीय होगा, लेकिन किसी भी प्रोसेसिंग करते समय get()
के माध्यम से इन सदस्यों को सामान्य पॉइंटर्स का उपयोग करें।
उदाहरण के लिए ... एक गेम में टाइल्स का संग्रह हो सकता है जो इसके हैं। इन टाइल्स को boost::ptr_vector
में बनाने का अर्थ हो सकता है। जब इन टाइलों पर खेल खत्म हो जाता है तो स्वचालित रूप से मुक्त हो जाना चाहिए।
लेकिन अगर मैं अस्थायी रूप से एक बैग वस्तु में इन टाइलें रखना चाहते हैं, मैं बैग में एक और boost::ptr_vector
बना सकते हैं और transfer()
या के माध्यम से बैग के लिए खेल का टाइलें हस्तांतरण मैं एक std::vector<Tile*>
जहां टाइलें * के संदर्भ बनाना चाहिए चाहिए गेम में टाइल्स और बैग को पास करते हैं?
धन्यवाद।
** संपादित करें मुझे यह इंगित करना चाहिए कि मेरे उदाहरण में गेम में एक सदस्य के रूप में एक बैग वस्तु होगी। बैग केवल खेल के टाइल्स से भरेगा। तो बैग खेल के बिना मौजूद नहीं होगा।
आपकी ऑब्जेक्ट्स पहली जगह में ढेर क्यों आवंटित हैं? यही वह जगह है जहां पहली अलार्म घंटी मेरे लिए बंद हो जाती है। 'ptr_vector' * दुर्लभ * मामलों में एक अच्छा समाधान है जब आपको वास्तव में ढेर-आवंटित वस्तुओं को पॉइंटर्स स्टोर करने की आवश्यकता होती है। लेकिन अगर वे मामले दुर्लभ नहीं हैं, तो आप इसे गलत कर रहे हैं। ;) यदि गेम में टाइल्स का संग्रह है, तो वेक्टर में * उन्हें * रखें। इसमें पॉइंटर्स मत डालें। – jalf
यदि आपके पास C++ 11 कार्यान्वयन है तो इस प्रश्न का उत्तर काफी अप्रचलित है। उदाहरण के लिए, सी ++ 11 में ptr_x कक्षाओं के लिए बिल्कुल कोई कारण नहीं है। मानक कंटेनरों को केवल अपनी सामग्री को चलने योग्य होने की आवश्यकता होती है, जिसका अर्थ है ':: std :: unique_ptr' के कंटेनर इस के लिए जाने का तरीका हैं। – Omnifarious
@jalf मैं उलझन में हूँ। तो अगर मुझे एक जटिल वस्तु (एक फ़ाइल से कहें) के वेक्टर को पॉप्युलेट करना है, तो मुझे हमेशा ढेर पर आवंटित नहीं करना चाहिए? अगर मैं इसे ढेर में आवंटित नहीं करता हूं, तो वस्तु को प्रतिलिपि बनाई जानी चाहिए और पूरी वस्तु को वेक्टर में कॉपी किया जाएगा। इसलिए यदि मैं इसे सही तरीके से पालन करता हूं, तो आमतौर पर एक साझा_प्टर का उपयोग करने की तुलना में कॉपी की लागत लगाना बेहतर होता है, है ना? और आमतौर पर आप केवल ptr_container का उपयोग करना चाहते हैं यदि ऑब्जेक्ट गैर-प्रतिलिपि योग्य है? – Jerahmeel