मैं एक कक्षा बना रहा हूं जो एक डीएजी का हिस्सा होगा। कन्स्ट्रक्टर अन्य उदाहरणों के लिए पॉइंटर्स लेगा और निर्भरता सूची शुरू करने के लिए उनका उपयोग करेगा।
निर्भरता सूची शुरू होने के बाद, इसे केवल छोटा किया जा सकता है - उदाहरण को स्वयं या उसके किसी भी बच्चे की निर्भरता के रूप में कभी भी जोड़ा नहीं जा सकता है।मैं अपने कन्स्ट्रक्टर में कमजोर_ptrs कैसे सौंप सकता हूं?
::std::shared_ptr
इसे संभालने के लिए एक प्राकृतिक है। डीएजी को संभालने के लिए संदर्भ गणना की गई थी।
दुर्भाग्यवश, निर्भरताओं को अपने आश्रितों को जानने की आवश्यकता है - जब निर्भरता अपडेट की जाती है, तो इसे अपने सभी आश्रितों को बताने की आवश्यकता होती है।
यह एक छोटा सा चक्र बनाता है जिसे ::std::weak_ptr
के साथ तोड़ दिया जा सकता है। निर्भरता सिर्फ उन आश्रितों के बारे में भूल सकती है जो दूर जाते हैं।
लेकिन मुझे निर्माण के दौरान ::std::weak_ptr
बनाने के लिए एक आश्रित के लिए कोई रास्ता नहीं मिल रहा है।
यह काम नहीं करता:
object::object(shared_ptr<object> dependency)
{
weak_ptr<object> me = shared_from_this();
dependency->add_dependent(me);
dependencies_.push_back(dependency);
}
नाशक में यह कोड परिणाम निर्माता रास्ते से पहले बुलाया जा रहा है।
क्या इस समस्या को संभालने का कोई अच्छा तरीका है? मैं एक सी ++ 11-केवल समाधान के साथ पूरी तरह खुश हूं।
यह 'enable_shared_from_this' पहले से ही करता है। आपको अपनी घोषणा में एक भटक * भी मिला है - आप एक shared_ptr चाहते हैं, एक साझा_ptr के लिए सूचक नहीं। :) –
यह एक अच्छा जवाब है, लेकिन मेरी स्थिति में मेरे पास 'आश्रित' तर्क नहीं होगा। यह फ़ंक्शन प्रत्येक निर्भरता के आश्रितों की सूची में नव निर्मित नोड (यानी 'np') जोड़कर सभी निर्भरताओं के माध्यम से लूप करेगा। – Omnifarious
@ ओमनिफरीस: उदाहरण अपडेट किया गया। –