मेरे पास resource_manager
कक्षा है जो आंतरिक रूप से std::vector<boost::shared_ptr<resource> >
रखती है। resource_manager
resource
का मित्र वर्ग है। मैं resource
एस को केवल resource_manager
द्वारा बनाया/हटाया जाना चाहता हूं, इसलिए मैंने अपने रचनाकारों को निजी बनाया (जो ठीक काम करता है)।मैं share_ptr से निजी विनाशक कैसे कॉल कर सकता हूं?
हालांकि, अगर मैं विनाशक निजी बनाता हूं, तो कोड संकलित नहीं होता है क्योंकि विनाशक को boost::shared_ptr
द्वारा बुलाया जाता है, जो resource
का मित्र नहीं है। मैं resource_manager
से केवल const resource*
लौटकर "ग्राहकों द्वारा डिलीट न करें" नियम लागू करने के बारे में सोच रहा हूं, लेकिन किसी भी तरह से मैं इस विधि की सुरक्षा से संतुष्ट नहीं हूं (क्या होगा यदि क्लाइंट किसी भी तरह से पॉइंटर में गैर-कॉन्स में होता है?)
shared_ptr
का उपयोग न करने के स्पष्ट समाधान के अलावा, क्या आपके पास मेरी समस्या का कोई समाधान/बेहतर समाधान है?
एक ही रास्ता "ग्राहक किसी भी तरह गैर स्थिरांक के लिए सूचक भर में होता है" वे कर सकता है कि अगर है: तो सिर्फ एक Deleter functor या समारोह (आप पर निर्भर) जो बदले में अपने वर्ग के एक
friend
है बनाने वे const_cast का उपयोग कर कास्ट किया। "सुरक्षा" परिप्रेक्ष्य से कच्चे पॉइंटर्स और shared_ptr के बीच कोई अंतर नहीं है, अंतर जीवन-समय प्रबंधन में निहित है, जिसमें से मुझे यकीन नहीं है कि आप share_ptr के बिना कैसे संभालेंगे। – ronagए 'कॉन्स संसाधन * का मतलब यह नहीं है कि आप इसे हटा नहीं सकते हैं। – UncleBens
@UncleBens: यह नहीं है? मैंने सोचा कि संकलक आपको किसी नॉन-कॉन्स्ट फ़ंक्शन को कॉन्स्ट पर कॉल करने की अनुमति नहीं दे सकता है! क्या मैं गलत हूँ? या यह नियम विनाशक पर लागू नहीं होता है? –