2010-07-12 8 views
5

मैं एक माता पिता के बच्चे का रिश्ता के साथ दो वर्गों है (ग्राहक & क्रम निर्देशिका & फ़ाइल आदि)बढ़ावा shared_ptr और 'इस'

मैं

typedef boost::shared_ptr<Parent> ParentPtr 

और माता पिता के वर्ग में एक बनाने के लिए एक विधि है बच्चे

मुझे अपने माता-पिता को पॉइंटर्स रखने के लिए बच्चों के उदाहरणों की आवश्यकता है।

class Child 
{ 
.... 
    ParentPtr m_parent; 
.... 
} 

मैं चाहता हूं कि यह एक साझा_प्टर हो ताकि माता-पिता मौजूदा बच्चों के दौरान गायब न हों। मैं भी अन्य लोगों के माता पिता (माता पिता के लिए कारखाने विधि देता है एक ParentPtr) को ParentPtrs पकड़े

प्रश्न: कैसे बच्चे को एक ParentPtr

प्रयास दे सकते हैं (1)। अभिभावक :: चाइल्डफ़ैक्टरी

child->m_parent.reset(this); 

इससे बहुत बुरी चीजें होती हैं। अब माता-पिता पर इशारा करते हुए 2 पेरेंटपीआरटी चेन हैं; परिणाम माता-पिता

प्रयास (2) की समयपूर्व मृत्यु है। अभिभावक

ParentPtr m_me; 

जिसे माता-पिता कारखाने के वापसी मूल्य से कॉपी किया गया है। इसलिए मैं

child->m_parent = m_me; 

कर सकते हैं लेकिन अब जनक कभी नहीं मरता है क्योंकि यह अपने आप में

उत्तर

8

के लिए एक संदर्भ मैं काफी यकीन है कि enable_shared_from_this आपकी समस्या नहीं सुलझती हूँ रखती है: http://live.boost.org/doc/libs/1_43_0/libs/smart_ptr/enable_shared_from_this.html

यदि आप एक से अपने वर्ग व्युत्पन्न boost::enable_shared_from_this का विशेषज्ञता तो this (यह मानते हुए कि एक है) साझा करने वाले साझा पॉइंटर को प्राप्त करने के लिए आप सदस्य फ़ंक्शन में shared_from_this() का उपयोग कर सकते हैं।

उदा।

class Parent : public boost::enable_shared_from_this<Parent> 
{ 
    void MakeParentOf(Child& c) 
    { 
     c.m_parent = shared_from_this(); 
    } 
}; 
+0

महान उत्तर - धन्यवाद – pm100

+0

@ pm100: आपको 'weak_ptr' का उपयोग करने की आवश्यकता क्यों है? अगर बच्चे अपने माता-पिता के मालिक हैं (उन्हें साझा किया गया है) तो आपको 'shared_ptr' का उपयोग करने की आवश्यकता है। एक 'weak_ptr' स्वामित्व का संकेत नहीं देता है। –

+0

ओह हाँ आप सही हैं - मैं एक अलग समाधान के बारे में सोच रहा था - – pm100

0

अन्य प्रतिक्रिया बाहर सूचक है के रूप में, पहले आप enable_shared_from_this उपयोग करने के लिए shared_ptr प्राप्त करने के लिए होगा, लेकिन उसके बाद बच्चे कि रेफरी को रोक नहीं सकते, यह एक weak_ptr उपयोग करना चाहिए। weak_ptr एक shared_ptr की तरह है, सिवाय इसके कि यह get() विधि को कॉल करने तक संदर्भ नहीं रखेगा, जो आपको सामान्य shared_ptr वापस कर देगा जो आपको बच्चे के अंदर जितनी जल्दी हो सके से छुटकारा पाना चाहिए।

+0

आपको यह क्यों लगता है?मॉडल यह है कि बच्चे ("अन्य लोगों" के साथ) अपने माता-पिता के मालिक हैं; माता-पिता बच्चों के मालिक नहीं हैं। यदि बच्चे एक कमजोर सूचक का उपयोग करते हैं तो यह माता-पिता को "गायब होने" से रोक नहीं पाएगा, जबकि उनके पास अभी भी अस्तित्व में बच्चे हैं। –

+0

@ चार्ल्स क्षमा करें, मेरा बुरा। मैं उन चीज़ों को मान रहा हूं जिन्हें स्पष्ट रूप से उल्लेख नहीं किया गया था: मैंने माना कि यदि 'shared_ptr' और' weak_ptr' का उपयोग किया गया था, तो माता-पिता को अपने बच्चों के लिए रेफरी होगी। मैंने माना कि, सिर्फ इसलिए कि, डिफ़ॉल्ट रूप से, माता-पिता अपने बच्चों को नियंत्रित करते हैं, कम से कम वे 18 वर्ष की हो जाते हैं और घर छोड़ते हैं। यदि यह एक और तरीका है, तो कृपया मैंने जो भी कहा है उसे अनदेखा करें। – Gianni

+0

ठीक है, मुझे नहीं पता कि वास्तव में pm100 के कोड की संरचना क्या है, लेकिन मैं तर्क दे रहा था कि अगर वह अभी भी बच्चों के पास नष्ट होने के बारे में चिंतित है तो माता-पिता वर्ग का स्वामित्व नहीं हो सकता है (या तो सीधे मूल्य के द्वारा या 'shared_ptr') बच्चे वर्ग अन्यथा यह भी एक विचार नहीं होगा। स्वामित्व संबंध यह सुनिश्चित करेगा कि कोई बच्चा अपने अंतिम माता-पिता से आगे नहीं निकल सके। वैसे भी, यह मेरी समझ है कि आवश्यक स्वामित्व दूसरी तरफ है: "मैं चाहता हूं कि यह एक साझा_पीटीआर हो ताकि माता-पिता मौजूदा बच्चों के दौरान गायब न हों।" –