ठीक है, मैंने साझा-पॉइंटर्स का उपयोग करना शुरू किया और जितना संभव हो सके साझा पॉइंटर्स पास कर दिया। अब कच्चे पॉइंटर्स में कोई रूपांतरण नहीं है। यह अच्छा काम करता है, इस विशिष्ट मामले को छोड़कर:shared_ptr और यह पॉइंटर
मान लीजिए हम एक वर्ग भी अन्य वर्ग पर एक पर्यवेक्षक है कि, इस तरह है:
class MyClass : public IObserver
{
public:
MyClass (std::shared_ptr<SomeOtherClass> otherClass);
void DoSomethingImportant();
private:
std::shared_ptr<SomeOtherClass> m_otherClass;
};
इस वर्ग के अपने आवेदन में इस तरह प्रयोग किया जाता है:
std::shared_ptr<MyClass> myInstance(new MyClass(otherInstance));
...
myInstance->DoSomethingImportant();
MyClass को किसी अन्य वर्ग में साझा-पॉइंटर मिलता है और इसे अपने m_otherClass डेटा सदस्य में संग्रहीत करता है। DoSomethingImportant विधि में, MyClass उदाहरण m_otherClass पर स्वयं को एक पर्यवेक्षक के रूप में पंजीकृत करने सहित कई महत्वपूर्ण चीजें करता है, जैसे:
m_otherClass-> रजिस्टर ऑब्सर्वर (यह);
समस्याकि registerObserver विधि इस तरह परिभाषित किया गया है है:
शून्य registerObserver (std :: shared_ptr पर्यवेक्षक);
यह एक साझा सूचक की अपेक्षा करता है, लेकिन 'यह' एक कच्चा सूचक है, साझा नहीं है।
मैं इस को हल करने के तीन तरीके देखें:
- एक चाल एक साझा सूचक को एक सामान्य सूचक कन्वर्ट करने के लिए खोजें (देखें प्रश्न convert pointer to shared_ptr), लेकिन यह सवाल का जवाब केवल साझा-संकेत नकल करने के लिए सुझाव , पॉइंटर को साझा पॉइंटर में वास्तव में परिवर्तित करने के तरीके पर नहीं।
- इस तरह के तरीके में साझा-पॉइंटर को पास करें, जैसे: "myInstance-> DoSomethingImportant (myInstance);" जो थोड़ा बेवकूफ लगता है।
- पर्यवेक्षक भाग को एक अलग वर्ग में रखें। यह कुछ ओवरकिल की तरह दिखता है, और कक्षा को समझने में कठोर बना सकता है।
यह समस्या यह स्पष्ट करती है कि साझा-पॉइंटर्स केवल सी ++ के लिए एक ऐड-ऑन हैं (मुझे नहीं लगता कि आपको अन्य भाषाओं/वातावरण जैसे सी # (या सामान्य रूप से .NET) और जावा में एक ही समस्या है)।
इस स्थिति को संभालने के तरीके पर कोई अन्य सुझाव या युक्तियां?
क्या आप 'enable_shared_from_this' का उपयोग नहीं कर सकते? (देखें [इस से एक बूस्ट साझा_पीआर प्राप्त करना] (http://stackoverflow.com/questions/142391/getting-a-boostshared-ptr-for-this)) –
इस प्रश्न और सभी उत्तरों को किसने कम किया है? क्या यह वाकई इतना बेवकूफ सवाल है? – Patrick
मुझे कभी-कभी आश्चर्य होता है ... अगर कुछ लोग बस बैज प्राप्त करने की कोशिश नहीं कर रहे हैं http://stackoverflow.com/badges/7/critic?userid=147192 –