2009-09-28 17 views
10

मान लीजिए मैं है निम्नलिखित (सरलीकृत मामले):कॉपी निर्माता: गहरी एक अमूर्त वर्ग को कॉपी

class Color; 

class IColor 
{ 
public: 
    virtual Color getValue(const float u, const float v) const = 0; 
}; 

class Color : public IColor 
{ 
public: 
    float r,g,b; 
    Color(float ar, float ag, float ab) : r(ar), g(ag), b(ab) {} 
    Color getValue(const float u, const float v) const 
    { 
     return Color(r, g, b) 
    } 
} 

class Material 
{ 
private: 
    IColor* _color; 
public: 
    Material(); 
    Material(const Material& m); 
} 

अब, वहाँ मुझे की प्रतिलिपि निर्माता में सार IColor की गहरी प्रतिलिपि करने के लिए किसी भी तरह से है सामग्री? यही है, मैं चाहता हूं कि जो कुछ भी m._color हो, (रंग, एक बनावट) की प्रतिलिपि बनाई जा सके, न केवल आईसीओलर के सूचक।

उत्तर

7

आप अपने इंटरफ़ेस में क्लोन() फ़ंक्शन जोड़ सकते हैं।

1

आपको उस कोड को सामग्री प्रतिलिपि निर्माता को जोड़ना होगा। फिर अपने विनाशक में आवंटित आईसीओलर को मुक्त करने के लिए कोड।

आप आईसीओलर के लिए वर्चुअल विनाशक भी जोड़ना चाहते हैं।

एक गहरी प्रतिलिपि करने का एकमात्र तरीका स्वचालित रूप से एक पॉइंटर के बजाय एक आईसीओलर के बजाय रंग को स्टोर करना होगा।

+0

आईसीओलर पर एक पॉइंटर संग्रहीत करने से गहरी प्रतिलिपि अक्षम हो जाएगी? –

+0

डिफ़ॉल्ट रूप से यह केवल सूचक पते को कॉपी किए गए सूचक पते में कॉपी करेगा। यह उस प्रतिलिपि की प्रतिलिपि नहीं करेगा जो इंगित किया जा रहा है और फिर सूचक को फिर से समायोजित करें। कॉपी कन्स्ट्रक्टर से बुलाया क्लोन() फ़ंक्शन बनाने में ल्यूक का सबसे अच्छा सुझाव है। –

0

रंग करने के लिए एक क्लोन() विधि को जोड़ने पर एक नजर डालें शायद सबसे अच्छा है, लेकिन * यदि आपको लगता है कि विकल्प नहीं है, एक और समाधान का रंग करने के लिए IColor * कास्ट करने के लिए dynamic_cast उपयोग करने के लिए किया जाएगा। फिर आप कलर कॉपी कन्स्ट्रक्टर का आह्वान कर सकते हैं।

+0

लेकिन आप नहीं जानते कि यह रंग या बनावट है, तो आप गतिशील_कास्ट कैसे कर सकते हैं? – Barth

+0

यदि ऑब्जेक्ट प्रकार का रंग नहीं है तो dynamic_cast (_color) शून्य वापस आ जाएगा। (गतिशील कास्ट/आरटीआई यह पता लगा सकता है कि वास्तविक प्रकार तब तक है जब तक कक्षा में कम से कम एक आभासी विधि हो)। तो आप क्या कर सकते हैं संभावनाओं का परीक्षण करें। क्लोन() विधि का उपयोग करते हुए यह कोई मजेदार नहीं है, और लगभग हमेशा खराब होता है, लेकिन दुर्लभ परिस्थितियां होती हैं जहां आपको ऐसा कुछ करना होता है। –

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