2009-09-17 7 views
5

क्या गैर-प्रतिलिपि तत्वों वाले एसटीएल अभियंता का कोई तरीका है?noncopyable तत्वों का कंटेनर कैसे बनाएं

कुछ इस तरह:

class noncopyable 
{ 
    noncopyable(noncopyable&); 
    const noncopyable& operator=(noncopyable&); 
public: 
    noncopyable(){}; 
}; 

int main() 
{ 
    list<noncopyable> MyList; //error C2248: 'noncopyable::noncopyable' : cannot access private member declared in class 'noncopyable' 
} 

उत्तर

15

नहीं, गैर-प्रतिलिपि तत्व C++ कंटेनर कक्षाओं में नहीं हो सकते हैं।

मानक के अनुसार, 23.1 अनुच्छेद 3, "इन घटकों में संग्रहीत वस्तुओं का प्रकार CopyConstructible प्रकार (20.1.3), और Assignable प्रकारों की अतिरिक्त आवश्यकताओं को पूरा करना चाहिए।"

+0

अच्छा बिंदु! std :: unique_ptr उसके लिए एक विकल्प हो सकता है यदि वह नए सी ++ एसटीएल के साथ एक नए कंपाइलर का उपयोग करता है। – jdehaan

+0

मुझे ऑब्जेक्ट की जटिल गहरी प्रति आवश्यकता को हटाकर मेरी समस्या का समाधान करना पड़ा। मैंने यह जवाब चुना है क्योंकि यह सीधे मेरे प्रश्न का उत्तर देता है। लेकिन दूसरा भी अच्छा है! – Vargas

+1

यदि ये आवश्यकताएं हैं, तो वेक्टर या सूची में एक अद्वितीय_प्टर स्टोर करना क्यों संभव है? unique_ptr प्रति-रचनात्मक नहीं है। –

15

एक विकल्प तत्वों (अधिमानतः एक shared_ptr) की ओर इशारा की एक सूची बनाने के लिए है। यह वही नहीं है जो आप चाहते हैं लेकिन यह काम पूरा हो जाएगा।

+2

+1, कम या ज्यादा एकमात्र विकल्प, क्योंकि आईआईआरसी 'std :: list' के लिए प्रतिलिपि बनाने योग्य तत्वों की आवश्यकता होती है। –

+0

वही है जो मैं टालने की कोशिश कर रहा हूं, मैं कभी-कभी MyList.clear() को कॉल करना चाहता हूं और मुझे उस गैर-अयोग्य के लिए विनाशक की आवश्यकता है। – Vargas

+0

युप - मानक कहता है: "इन घटकों में संग्रहीत वस्तुओं के प्रकार को कॉपीकोनस्ट्रक्टेबल प्रकार (20.1.3), और असाइन करने योग्य प्रकारों की अतिरिक्त आवश्यकताओं की आवश्यकताओं को पूरा करना होगा।" –

2

एक और विकल्प Boost Pointer Container library का उपयोग करना है। यह std :: auto_ptrs के मानक कंटेनर की तरह काम करता है, ऐसी चीज संभव थी: यह अपने तत्वों के अनन्य स्वामित्व को बरकरार रखती है, और इसकी प्रतिलिपि नहीं बनाई जा सकती है। इसमें shared_ptrs के मानक कंटेनर से भी कम ओवरहेड होता है।