2010-11-25 10 views
13

मुझे बेस क्लास के shared_ptr का उपयोग करने में कोई समस्या है, मैं इसे संदर्भित करते समय व्युत्पन्न क्लास के तरीकों को कॉल करने में सक्षम नहीं प्रतीत होता। मेरा मानना ​​है कि कोड मुझसे अधिक वर्बोज़ हो जाएगा:boost :: shared_ptr और गतिशील कास्ट

class Base : public boost::enable_shared_from_this<Base> 
{ 
    public: 
    typedef boost::shared_ptr<BabelNet> pointer; 
}; 

class Derived : public Base 
{ 
    public: 
    static pointer create() 
       { 
         return pointer(new Derived); 
       } 
    void    anyMethod() 
    { 
     Base::pointer foo = Derived::create(); 
     // I can't call any method of Derived with foo 
     // How can I manage to do this ? 
     // is dynamic_cast a valid answer ? 
     foo->derivedMethod(); // -> compilation fail 
    } 

}; 
+1

अगर आपकी उदाहरण संकलित करने योग्य थी, तो यह आपकी मदद करेगा, निश्चित रूप से अपमानजनक लाइन टिप्पणी के साथ। –

उत्तर

18

static_cast with boost::shared_ptr?

आप dynamic_pointer_cast उपयोग करने के लिए उचित shared_ptr इन्स्टेन्शियशन प्राप्त करने की आवश्यकता होगी। (dynamic_cast के अनुरूप)

+1

'static_pointer_cast' क्यों नहीं? मुझे लगता है कि उदाहरण वास्तविक कोड का प्रतिनिधि नहीं है, लेकिन उदाहरण को गतिशील कास्ट की आवश्यकता नहीं है (क्योंकि ऑब्जेक्ट लक्ष्य प्रकार का है), और एक को अनुमति नहीं देता है (क्योंकि न तो कक्षा में कोई वर्चुअल फ़ंक्शन है) । –

+0

मैंने वास्तव में पोस्ट के शीर्षक के कारण 'dynamic_pointer_cast' रखा है। लेकिन हाँ, उसके कोड में, एक 'static_pointer_cast' करेगा। – lijie

+0

ठीक है, धन्यवाद, मुझे एक दिलचस्प लेख मिला है: http://nealabq.com/blog/2008/11/26/pointer_cast/ अगर मैं सिर्फ derived_class पर shared_ptr का उपयोग करता हूं, तो मैं इसे shared_ptr के रूप में पास कर सकता हूं आधार वर्ग, साफ। – HolyLa

1

derivedMethod आधार वर्ग (आभासी या नहीं) में घोषित नहीं किया जाता है, तो यह सामान्य है कि संकलन विफल हो जाएगा है। साझा पीआरटी बेस क्लास को जानता है और इसका उपयोग करता है (पॉइंटर के माध्यम से), और व्युत्पन्न वर्ग और इसके विशिष्ट तरीकों के बारे में कुछ भी नहीं जानता है।

+0

यदि पॉइंटर व्युत्पन्न वर्ग का टाइपिफ़ था, तो क्या इसे बढ़ाया जा सकता था ताकि बाहरी वर्ग केवल बेस :: पॉइंटर के बारे में ही जान सके? – HolyLa

0

आपका कोड कच्चे पॉइंटर्स के साथ भी काम नहीं करेगा।

आपको या तो बेस क्लास में derivedMethod() विधि घोषित करने या Derived ऑब्जेक्ट पर पॉइंटर होने की आवश्यकता है।

4

साझा पॉइंटर या नहीं, जब आपके पास Base पर पॉइंटर है, तो आप केवल Base से सदस्य फ़ंक्शंस को कॉल कर सकते हैं।

यदि आपको वास्तव में dynamic_cast की आवश्यकता है, तो आप dynamic_pointer_castboost से उपयोग कर सकते हैं, लेकिन संभावना है कि आपको नहीं करना चाहिए। इसके बजाय, अपने डिजाइन के बारे में सोचें: DerivedBase है, और यह एक बेहद मजबूत संबंध है, इसलिए Base इंटरफ़ेस के बारे में सावधानीपूर्वक सोचें और यदि ठोस प्रकार को वास्तव में जाना जाना है।