2010-03-05 20 views
5

मेरे पास एक ऐसा मामला है जहां मैं std :: वेक्टर में संसाधनों की एक सूची स्टोर करना चाहता हूं। मैं इसे देखना के रूप में, मेरे विकल्प इस प्रकार हैं:आरएआईआई और सी ++ एसटीएल

  1. एक डिफ़ॉल्ट निर्माता
  2. स्टोर उन्हें दे मेरी संसाधन ढेर वस्तुओं (और उन्हें एक साझा सूचक में लपेट)

विकल्प 1 यह बनाता है के रूप में अमान्य संसाधनों का निर्माण संभव है और विकल्प 2 मुझे ढेर का उपयोग करने के लिए मजबूर करता है।

क्या मुझे यहां कोई विकल्प याद आ रहा है?

+1

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

+2

"विकल्प 2 मुझे ढेर का उपयोग करने के लिए मजबूर करता है" - ठीक है, वेक्टर अपनी सामग्री को ढेर पर भी स्टोर करेगा (जब तक आप एक कस्टम आवंटक का उपयोग नहीं करते), हालांकि संगत स्मृति में। तो आप एक ही तरीके से ढेर का उपयोग करके बाईपास करने में सक्षम नहीं होंगे। –

+0

ने पाया कि मैं अपने संसाधन में एक संदर्भ संग्रहीत कर रहा था, इसलिए समस्या डिफ़ॉल्ट कन्स्ट्रक्टर नहीं थी, thx – dirk

उत्तर

7

आपको उदाहरणों का वेक्टर रखने के लिए डिफ़ॉल्ट कन्स्ट्रक्टर की आवश्यकता नहीं है।

एकमात्र सीमा यह है कि कक्षा में कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं होने पर आप डिफ़ॉल्ट तर्क के साथ वेक्टर :: आकार का उपयोग नहीं कर सकते हैं।

vec.resize(20); // requires default constructor 

लेकिन आप वेक्टर दे सकते हैं :: आकार बदलने के लिए एक डिफ़ॉल्ट वस्तु:

std::vector<foo> vec; 
vec.resize(20, foo(10)); // give a sample object since foo has not default constructor 
1

आप वेक्टर में गैर तुच्छ constuctor के साथ वस्तुओं की दुकान कर सकते हैं। एसटीएल कंटेनरों में ऑब्जेक्ट स्टोर में असाइनमेंट (प्रतिलिपि कन्स्ट्रक्टर और असाइन ऑपरेटर) असाइनमेंट होना चाहिए।

1

एक तीसरा विकल्प Boost.PointerContainer का उपयोग करना होगा। हालांकि, आपकी वस्तुओं को ढेर पर अलग-अलग आवंटित किया जाएगा। जैसा कि जोहान ने टिप्पणी की है, std :: vector पहले से ही ऑब्जेक्ट्स (contiguously) स्टोर करने के लिए ढेर का उपयोग करता है, इसलिए ढेर से पूरी तरह से बचने का कोई तरीका नहीं है।

अक्सर संसाधनों की अनुमति देने के लिए यह समझ में नहीं आता है (जैसे म्यूटेक्स, आई/ओ धाराएं, आदि) प्रतिलिपि बनाने के लिए। तो उन्हें कॉपी कन्स्ट्रक्टर और असाइनमेंट ऑपरेटर निजी बनाकर गैर-प्रतिलिपि प्रस्तुत की जानी चाहिए। दुर्भाग्यवश, गैर-प्रतिलिपि प्रतिबंध, संसाधनों को सीधे एसटीएल कंटेनर के अंदर मूल्यों के रूप में स्टोर करना असंभव बनाता है। इसलिए किसी को Boost.PointerContainer या स्मार्ट पॉइंटर्स के कंटेनर का सहारा लेना चाहिए। Boost.PointerContainer प्रलेखन के प्रेरणा अनुभाग बताता है कि आप एक दूसरे पर क्यों उपयोग करना पसंद करेंगे।

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