2014-07-08 12 views
5

मुझे एक समस्या है जहां मैं किसी ऑब्जेक्ट की प्रतिलिपि बनाना चाहता हूं, लेकिन इसे स्लाइसिंग से बचाना चाहता हूं।ऑब्जेक्ट स्लाइसिंग से बचें C++

DerivedObj derivedObj; 
myFunc(derivedObj); 

void myFunc(MyObj &obj) 
{ 
    MyObj *saveForLater = new MyObj(obj); // slices my object 
    // ... // 
} 

क्या इसके आसपास जाने का कोई तरीका है? मुझे एक प्रतिलिपि बनाने की आवश्यकता है क्योंकि मूल वस्तु को आवश्यक होने से पहले गुंजाइश छोड़ दी जाएगी।

+0

@clcto इससे कोई फर्क नहीं पड़ता? –

+2

@clcto एक संदर्भ बनाम एक पॉइंटर में पास करना कोई मुद्दा नहीं है। पॉइंटर्स * और * संदर्भ कटा हुआ नहीं है। पॉइंटर्स और संदर्भों पर विचार करें "गैर-स्केलेबल"। 'नई' कॉल के साथ कथन पर टुकड़ा होता है। –

+1

जहां तक ​​मुझे पता है, आपके पास दो मुख्य विकल्प हैं, 'क्लोन()' नामक वर्चुअल विधि है या 'myjunc()' के कुछ प्रकार के स्वामित्व को 'my_unr() 'में उपयोग करने में सक्षम हो, शायद' shared_ptr का उपयोग करके '। –

उत्तर

6

यदि आपकी बाधाएं इसे अनुमति देती हैं, तो आप वर्चुअल Clone विधि जोड़ सकते हैं।

class MyObj 
{ 
     public: 
      virtual MyObj* Clone() const = 0; 
}; 

class DerivedObj : public MyObj 
{ 
     public: 
      virtual MyObj* Clone() const 
      { 
       return new DerivedObj(*this); 
      } 
}; 




void myFunc(MyObj &obj) 
{ 
     MyObj *saveForLater = obj.Clone(); 
     // ... // 
    } 
संबंधित मुद्दे