c++ - How to deal with different ownership strategies for a pointer member? -
निम्नलिखित वर्ग संरचना पर विचार करें:
वर्ग फ़िल्टर {आभासी शून्य फिल्टर () = 0 ; आभासी ~ फ़िल्टर () {}}; वर्ग फ़िल्टरचिह्न: सार्वजनिक फ़िल्टर {फ़िल्टरचिह्न (संग्रह & lt; फ़िल्टर * & gt; फिल्टर) {// प्रतियां "फिल्टर" कुछ आंतरिक सूची // (संकेतों की प्रतिलिपि बनाई जाती हैं, खुद को फिल्टर नहीं)} ~ फ़िल्टरचिह्न () {// क्या करें मैं यहाँ क्या? } शून्य फ़िल्टर () {// अनुक्रम में फ़िल्टर निष्पादित करें}};
मैं एक पुस्तकालय में कक्षा को उजागर कर रहा हूं, इसलिए मेरा नियंत्रण नहीं है कि इसका उपयोग कैसे किया जाएगा।
मुझे वर्तमान में कुछ डिज़ाइन समस्याएं हैं फ़िल्टर
ऑब्जेक्ट्स फ़िल्टरचिह्न
के स्वामित्व के संबंध में पॉइंटर्स धारण कर रहे हैं अधिक विशेष रूप से, यहां FilterChain
:
- परिदृश्य ए के लिए दो संभावित उपयोग परिदृश्य हैं: मेरी लाइब्रेरी में से कुछ फ़ंक्शंस, एक (संभवतः जटिल) फ़िल्टर श्रृंखला का निर्माण कर रहे हैं, आवंटित आवश्यकतानुसार मेमोरी, और एक नए-आबंटित
फ़िल्टरचिह्न
ऑब्जेक्ट वापस लौटाने के लिए उदाहरण के लिए, इनमें से एक फ़ंक्शंस फ़ाइल से एक फिल्टर श्रृंखला तैयार करती है, जो कि मनमाने ढंग से जटिल फिल्टर (फ़िल्टर श्रृंखलाओं की फ़िल्टर श्रृंखला सहित, आदि) का वर्णन कर सकती है। - परिदृश्य बी: उपयोगकर्ता के पास
फ़िल्टर ऑब्जेक्ट्स के एक गुच्छा तक पहुंच है, और इन्हें गठबंधन करना चाहता है। एक विशिष्ट तरीके से फ़िल्टर चेन उपयोगकर्ता अपने कोड के उपयोग के लिए
FilterChain
निर्माण करता है, तब उनको नष्ट कर लेते हैं, जब उनके साथ किया जाता है।फ़िल्टरचिह्न
उनको संदर्भित कर दिया जाता है जबफ़िल्टर
ऑब्जेक्ट को नष्ट नहीं होना चाहिए।
अब, फ़िल्टरचिह्न
ऑब्जेक्ट में स्वामित्व का प्रबंधन करने के लिए दो सरल तरीके हैं:
-
फ़िल्टरचिह्न
स्वयंफ़िल्टर
ऑब्जेक्ट्स। इसका अर्थ है किFilterChain
द्वारा संदर्भित वस्तुएंफ़िल्टरचैन
के नाशक में नष्ट हो जाती हैं। जो परिदृश्य बी के साथ असंगत है। -
फ़िल्टरचिह्न
करता है नहींफ़िल्टर
ऑब्जेक्ट के स्वामी हैं। इसका अर्थ हैफ़िल्टरचैन
का नाशक कुछ भी नहीं करता है अब परिदृश्य ए के साथ एक समस्या है, क्योंकि उपयोगकर्ता को सभीफ़िल्टर
ऑब्जेक्ट्स की आंतरिक संरचना को पता होना चाहिए ताकि उन सभी को नष्ट किए बिना नष्ट कर दिया जा सके, जैसे कि अभिभावकFilterChain < / कोड> यह स्वयं नहीं करता है यह सिर्फ खराब डिजाइन है, और स्मृति लीक के लिए पूछ रहा है।
नतीजतन, मुझे कुछ और जटिल की आवश्यकता है मेरा पहला अनुमान है कि एक स्मार्ट पॉइंटर को एक सैटेटेबल बूलियन फ़्लैग के साथ डिज़ाइन करना है, यह दर्शाता है कि स्मार्ट पॉइंटर ऑब्जेक्ट का मालिक है या नहीं। फिर पॉइंटर्स का संग्रह
फ़िल्टर
ऑब्जेक्ट्स पर लेने के बजाय,FilterChain
स्मार्ट पॉइंटर्स का संग्रहफ़िल्टर
ऑब्जेक्ट्स पर ले जाएगा। जबफ़िल्टरचिह्न
के नाशक को बुलाया जाता है, तो यह स्मार्ट पॉइंटर्स को नष्ट कर देगा स्मार्ट पॉइंटर के नाशक तब ही वस्तु को नष्ट कर देगा (एकफ़िल्टर
ऑब्जेक्ट) अगर और केवल तभी बूलियन ध्वज इंगित करता है कि स्वामित्व निर्धारित है।मुझे लगता है कि यह समस्या सी ++ में सामान्य है, लेकिन लोकप्रिय समाधानों या चालाक डिजाइन पैटर्न के लिए मेरी वेब खोज बहुत सफल नहीं थी दरअसल,
auto_ptr
यहां वास्तव में मदद नहीं करता है औरshared_ptr
ओपेकिल लगता है तो, क्या मेरा समाधान एक अच्छा विचार है या नहीं?
स्मार्ट पॉइंटर्स यहां नहीं हैं: जाहिर है आपके पास एक डिजाइन समस्या यह है कि किसी एक या किसी अन्य को जीवन की जन्मजात और स्वामित्व की सावधानी से विचार करना चाहिए। यह विशेष रूप से सच होगा यदि आप रन-टाइम पर फ़िल्टर ग्राफ़ में फिर से पैच फिल्टर की क्षमता चाहते हैं या मिश्रित FilterChain
ऑब्जेक्ट बनाने की क्षमता चाहते हैं।
shared_ptr का उपयोग करना
इनमें से अधिकतर समस्याओं को एक झटके में निकाल देगा और आपके डिज़ाइन को बहुत आसान बना देगा। मुझे लगता है कि यहां केवल एक संभावित क्षमता है, अगर आपके फ़िल्टर में चक्र होना होता है मैं देख सकता हूं कि यदि आपके पास कुछ प्रकार का फ़ीडबैक लूप है उस उदाहरण में मैं एक एकल वर्ग के स्वामित्व वाले सभी फ़िल्टर
ऑब्जेक्ट्स का सुझाव दे सकता हूं, और फिर FilterChain
कमजोर संकेतों को फ़िल्टर
ऑब्जेक्ट्स में स्टोर करेगा।
मैं दांव लगाता हूं कि फिल्टर चरणों का निष्पादन समय स्मार्ट पॉइंटर के डिफरेंसिंग के अतिरिक्त ओवरहेड से अधिक होगा shared_ptr
बहुत हल्के होने के लिए डिज़ाइन किया गया है।
Comments
Post a Comment