2012-11-13 17 views
6

मुझे यकीन नहीं है कि क्या मैं किसी दस्तावेज़ त्रुटि या सिरदर्द से अधिक पीड़ित हूं, इसलिए ...मैं किसी सदस्य को shared_ptr कैसे बना सकता हूं?

मैं जो करना चाहता हूं वह एक साझा_ptr है जो किसी अन्य के साथ स्वामित्व साझा करता है, लेकिन जो किसी सदस्य का संदर्भ देता है ऑब्जेक्ट की पूरी वस्तु के बजाय ऑब्जेक्ट। सरल उदाहरण के लिए, प्रारंभिक बिंदु ...

struct s 
{ 
    int a, b; 
}; 

shared_ptr<s> s1 (new s); // pointing to whole object 
en.cppreference.com से

, निर्माता (8) shared_ptr के

template< class Y > 
shared_ptr(const shared_ptr<Y>& r, T *ptr); 

विवरण का उल्लेख है "एक shared_ptr जो r साथ स्वामित्व जानकारी है कि शेयर निर्माणों है ..., लेकिन एक असंबंधित और अप्रबंधित सूचक पीआरआर रखता है ... जैसे कि सामान्य उपयोग मामलों में जहां पीआरआर आर द्वारा प्रबंधित ऑब्जेक्ट का सदस्य होता है "।

तो ... T बस उस निर्माता में टेम्पलेट से गलती से चूक गया था, या क्या मुझे कुछ याद आ रही है? वास्तव में, वाई ऐसा लगता है कि यह मेरे लिए भी गलत है, तो आम तौर पर यह है कि कन्स्ट्रक्टर सही ढंग से वर्णित है?

क्या मैं आशा करती हूं कि मैं क्या कर सकते हैं कुछ इस तरह है ... सदस्य a (एक int) को

shared_ptr<int> s2 (s1, &(s1.get()->a)); 

s2 अंक है, लेकिन शेयरों s1 साथ पूरी वस्तु का स्वामित्व।

क्या वह साईं है? जबकि Y पैरामीटर है कि विशेष रूप shared_ptr निर्माता पर टेम्पलेट पैरामीटर है

+0

शायद मैं कुछ याद कर रहा हूँ, लेकिन क्यों आप एक सदस्य वर के लिए एक shared_ptr कि आवंटित नहीं किया गया है चाहेगा ढेर पर? यानी एस 2 के लिए कच्चे सूचक का उपयोग क्यों न करें? –

+0

@ आरसी - यह सुनिश्चित करने के लिए कि यदि मूल shared_ptr को हटा दिया जाता है, तो वस्तु स्वयं नहीं होती - यानी यह सुनिश्चित करने के लिए कि एस 2 एक खतरनाक सूचक नहीं बनता है। वास्तविक दुनिया के उदाहरण में, एस 1 और एस 2 के दायरे समान नहीं होंगे। – Steve314

+0

हां, यह पूरी तरह से सभ्य है। इसके अलावा आपको '.get()' की आवश्यकता नहीं है। – atzz

उत्तर

9

T पैरामीटर, shared_ptr पर ही टेम्पलेट पैरामीटर है। इस तरह कुछ:

template< class T > 
class shared_ptr 
{ 
    template< class Y > 
    shared_ptr(const shared_ptr<Y>& r, T *ptr); 
} 

आपके द्वारा पोस्ट किए गए उदाहरण कोड के लिए, यह मुझे ठीक लग रहा है।

+0

हर किसी का अधिकार - आप थोड़ा तेज़ होने के लिए जीतते हैं। मैं एक बेवकूफ महसूस कर रहा हूँ - मैं स्पष्ट रूप से हाल ही में अधिक टेम्पलेट सामान नहीं कर रहा है। मैं सदस्य टेम्पलेट्स के बारे में पूरी तरह से भूल गया। – Steve314

4

दस्तावेज़ीकरण सही है। आप भूल रहे हैं कि इस वर्ग टेम्पलेट shared_ptr<T> पर एक निर्माता के प्रलेखन अर्थात निर्माता के वर्ग से योग्य घोषणा है:

int और Y
template<typename T> 
template<typename Y> 
shared_ptr<T>::shared_ptr(const shared_ptr<Y>& r, T *ptr); 

तो अपने उदाहरण में T है s है।

2

T कक्षा का टेम्पलेट पैरामीटर है, कन्स्ट्रक्टर के नहीं। और यह वही है जैसा कि यह होना चाहिए: किसी सदस्य को एक सूचक के पास सदस्य का प्रकार होना चाहिए और उस मामले में युक्त ऑब्जेक्ट (Y) के प्रकार को भूलना/मिटाना (टाइप-एरर देखें) होना चाहिए।

कोड तुम्हें तैनात काम करना चाहिए, आप भी लिख सकते हैं एक छोटे से सरल रूप में:

shared_ptr<int> s2 (s1, &s1->a); 
+0

किसी कारण से मैं कभी भी '&' की प्राथमिकता के बारे में निश्चित नहीं हूं - शायद इसलिए कि मैं हमेशा जांच के बजाय अतिरिक्त माता-पिता जोड़ता हूं। 'गेट' भी जानबूझकर था, लेकिन मुझे यकीन नहीं है कि चीजों को और अधिक स्पष्ट तर्क समझ में आता है। मुझे वास्तव में अपने सिरदर्द को दोषी ठहराते रहना चाहिए। – Steve314