अद्यतन: इस उदाहरण में shared_ptr बूस्ट में से एक जैसा है, लेकिन यह shared_polymorphic_downcast (या उस समस्या के लिए dynamic_pointer_cast या static_pointer_cast का समर्थन नहीं करता है) का समर्थन नहीं करता है! ,डाउनकास्टिंग share_ptr <Base> साझा_ptr <Derived> पर?
struct Base { };
struct Derived : public Base { };
shared_ptr<Base> base(new Base());
shared_ptr<Derived> derived;
// error: invalid conversion from 'Base* const' to 'Derived*'
derived = base;
अब तक तो अच्छा:
मैं संदर्भ गिनती खोने के बिना एक व्युत्पन्न वर्ग के लिए एक साझा सूचक को प्रारंभ करने की कोशिश कर रहा हूँ। मैंने उम्मीद नहीं की थी कि सी ++ बेस * को व्युत्पन्न * में परिवर्तित कर देगा। हालांकि, मैं कोड द्वारा व्यक्त की गई कार्यक्षमता चाहता हूं (यानी बेस पॉइंटर को कम करते समय संदर्भ गणना को बनाए रखना)। मेरी पहली सोचा ताकि जगह ले सकता है व्युत्पन्न करने के लिए एक अंतर्निहित रूपांतरण बेस में एक डाली ऑपरेटर उपलब्ध कराने के लिए किया गया था (pedants के लिए: मैं की जाँच करेगा कि नीचे डाली मान्य है, चिंता मत करो):
struct Base {
operator Derived*();
}
// ...
Base::operator Derived*() {
return down_cast<Derived*>(this);
}
ठीक है, यह मदद नहीं की। ऐसा लगता है कि संकलक ने मेरे टाइपकास्ट ऑपरेटर को पूरी तरह नजरअंदाज कर दिया। कोई विचार है कि मैं share_ptr असाइनमेंट कैसे काम कर सकता हूं? अतिरिक्त बिंदुओं के लिए: किस प्रकार का प्रकार Base* const
है? const Base*
मैं समझता हूं, लेकिन Base* const
? const
इस मामले में क्या संदर्भित करता है?
साझा_ptr के बजाय आपको साझा_ptr क्यों चाहिए? –
Bill
क्योंकि मैं व्युत्पन्न में कार्यक्षमता तक पहुंच बनाना चाहता हूं जो कि बेस में नहीं है, ऑब्जेक्ट को क्लोन करने के बिना (मुझे एक ऑब्जेक्ट चाहिए, दो साझा पॉइंटर्स द्वारा संदर्भित)। वैसे, कास्ट ऑपरेटर क्यों काम नहीं करते? –