2009-03-09 11 views
71

के समतुल्य boost::shared_ptr के साथ क्या है?static_cast :: shared_ptr?

दूसरे शब्दों में, कैसे मैं निम्नलिखित

Base* b = new Derived(); 
Derived* d = static_cast<Derived*>(b); 

जब shared_ptr का उपयोग कर फिर से लिखने की क्या ज़रूरत है?

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = ??? 
+22

चाहिए यह नहीं' बेस * ख = नए व्युत्पन्न() को परिभाषित नहीं करता? – legends2k

उत्तर

104

उपयोग boost::static_pointer_cast:

boost::shared_ptr<Base> b(new Derived()); 
boost::shared_ptr<Derived> d = boost::static_pointer_cast<Derived>(b); 
+0

मैंने पहले static_pointer_cast के बारे में नहीं जानते, कच्चे सूचक को कास्टिंग और रीव्रैप करने का प्रयास किया। तो मुझे लगता है कि यह जानकारी स्टैक ओवरफ्लो पर उपयोगी है। – Frank

+4

'boost :: static_pointer_cast (बी) '' बेस' के रूप में भी इस्तेमाल किया जा सकता है। – dalle

+4

मैंने सोचा कि मैं इसे साझा करूँगा यदि आप इसका उपयोग कर रहे हैं और व्युत्पन्न वर्ग पूरी तरह से शामिल नहीं किया गया है (यानी इसे केवल घोषित किया गया है) तो आपको बहुत ही अनुपयोगी "अमान्य प्रकार रूपांतरण:" बेस * "से" व्युत्पन्न * ""। इससे पहले कि मैंने इसे समझ लिया, मुझे स्क्रीन पर घूमने में काफी लंबा समय लगा। :) –

22

स्मार्ट संकेत के लिए तीन कलाकारों ऑपरेटरों हैं: static_pointer_cast, dynamic_pointer_cast, और const_pointer_cast। वे या तो नामस्थान boost (<boost/shared_ptr.hpp> द्वारा प्रदान किए गए) या नामस्थान std::tr1 (या तो बूस्ट द्वारा या आपके कंपाइलर के TR1 कार्यान्वयन द्वारा प्रदान किए गए) में हैं।

3

एक टिप्पणी के रूप में: यदि व्युत्पन्न वास्तव में बेस से प्राप्त होता है, तो आपको स्थैतिक कास्ट के बजाय गतिशील_पोइंटर_कास्ट का उपयोग करना चाहिए। सिस्टम को यह पता लगाने का मौका मिलेगा कि आपकी कास्ट कब सही नहीं है।

+0

यदि बेस में आभासी सदस्य नहीं हैं तो सिस्टम इसका पता नहीं लगा सकता है। डायनेमिक_कास्ट उन वर्गों पर केवल जादुई है जिनमें वर्चुअल सदस्य हैं। – Aaron

+0

इसके अलावा एक प्रदर्शन हिट है। यदि आप वास्तव में जानते हैं कि कलाकार हमेशा सफल होना चाहिए, static_cast कोई रनटाइम ओवरहेड के साथ काम करेगा। –

+0

... कोई रनटाइम ओवरहेड * आमतौर पर *। मैं विवरण को याद नहीं कर सकता लेकिन वर्चुअल एकाधिक विरासत या किसी अन्य कोने के मामले में तकनीकी रूप से ओवरहेड है, लेकिन गतिशील_कास्ट से भी कम है। –

2

यह उल्लेख करना महत्वपूर्ण है कि बूस्ट और टीआर 1 के कार्यान्वयन द्वारा प्रदान किए गए कास्टिंग ऑपरेटरों की संख्या में अंतर है। `;

TR1 तीसरे ऑपरेटर const_pointer_cast()

+0

[इस संदर्भ] के अनुसार (http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast), 'const_pointer_cast' सी ++ 11 में उपलब्ध है। –

संबंधित मुद्दे