2011-05-30 19 views
7

के आधार पर एक फ़ंक्शन ओवरलोड करना इस तरह के बहुत सारे SO प्रश्न हैं, लेकिन मैं ठीक से नहीं ढूंढ पाया जो मैं ढूंढ रहा था। मुझे खेद है अगर यह एक डुप्लिकेट है।सी ++ share_ptr व्युत्पन्न कक्षा

class Son : public Parent { ... }; 
class Daughter : public Parent { ... }; 

मैं तो दो shared_ptr बेस कक्षा में ऐलान करते हैं और उन्हें व्युत्पन्न वर्ग से प्रत्येक के लिए एक shared_ptr साथ दृष्टांत:

मैं एक Parent वर्ग और दो व्युत्पन्न वर्ग है जो इसे से विरासत है

shared_ptr<Parent> son = shared_ptr<Son>(new Son()); 
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter()); 

आखिरकार, मैं एक कक्षा चाहता हूं जो shared_ptr<Parent> पर आधारित है जो व्युत्पन्न कक्षाओं के आधार पर इंगित करती है।

class Director { 
public: 
    void process(shared_ptr<Son> son); 
    void process(shared_ptr<Daughter> daughter); 
    ... 
}; 

तो मैं निम्नलिखित कोड लिखने में सक्षम होना चाहते हैं: मैं इस प्रभाव को प्राप्त करने के लिए अधिक भार समारोह का उपयोग कर सकते सवाल यह है कि अभी

shared_ptr<Parent> son = shared_ptr<Son>(new Son()); 
shared_ptr<Parent> daughter = shared_ptr<Daughter>(new Daughter()); 
Director director; 
director.process(son); 
director.process(daughter); 

मैं क्या करने वाले कर रहा हूँ (जो मैं से बचने के लिए चाहते हैं):

director.process_son(boost::shared_polymorphic_downcast<Son>(son)); 
director.process_daughter(boost::shared_polymorphic_downcast<Daughter>(daughter)); 

उत्तर

7

ऐसा ओवरलोड करना संभव नहीं है, तो आप Director पर एक विधि के भीतर प्रेषण के साथ कुछ इसी तरह प्राप्त करने के लिए एक स्विच बयान की आवश्यकता होगी।

शायद तुम Parent वर्ग के लिए process() विधि है कि जिस तरह से आप सामान्य आभासी समारोह संकल्प उपयोग कर सकते हैं सही एक कॉल करने के लिए आगे बढ़ना चाहिए (और Son और Daughter ओवरराइड),।

3

मुझे यकीन नहीं है कि कोई बेहतर तरीका है, इसलिए मैं आमतौर पर विज़िटर पैटर्न http://en.wikipedia.org/wiki/Visitor_pattern या ऐसी आवश्यकता पर समान डबल प्रेषण चाल का उपयोग करता हूं।

आपकी ऑब्जेक्ट्स शायद साझा_प्टर को स्वयं नहीं जानते हैं लेकिन आमतौर पर सरल संदर्भ अच्छी तरह से काम करता है।

0

आदर्श रूप से, ParentDirector के लिए प्रत्येक इंटरफ़ेस को सही ढंग से संसाधित करने के लिए पर्याप्त इंटरफ़ेस प्रदान करेगा, यह जानने के बिना कि यह कौन सा बच्चा है।

class Director { 
public: 
    void process(shared_ptr<Parent> obj); 
}; 

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

class ProcessSon: public Process, private Son { 
public: 
    void SpecificProc1(shared_ptr<Parent> obj) { 
    // Make this part of the process based on class Son 
    } 

    void SpecificProc2(shared_ptr<Parent> obj) { 
    // Make this part of the process based on class Son 
    } 
    ... 
}; 

Daughter के लिए एक समान एक कार्य करें और उचित Processprocess विधि करने के लिए कक्षा में सूचक के साथ एक साथ भेज Director का।

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