2014-07-08 11 views
5

Ho un problema in cui mi piacerebbe copiare un oggetto, ma voglio evitare di affettarlo.Come evitare la segmentazione degli oggetti C++

DerivedObj derivedObj; 
myFunc(derivedObj); 

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

C'è un modo per aggirare questo? Ho bisogno di fare una copia perché l'oggetto originale avrà lasciato l'ambito prima che sia richiesto.

+0

@ clcto come farà alcuna differenza? –

+2

@clcto Passare un puntatore contro un riferimento non è un problema. Puntatori * e * riferimenti NON vengono tagliati. Considerare puntatori e riferimenti "non affettabili". L'affettatura avviene sull'istruzione con la chiamata 'new'. –

+1

Per quanto ne so, hai due opzioni principali, un metodo virtuale chiamato 'clone()' o essere in grado di dare una sorta di proprietà di 'obj' a' myFunc() ', magari usando un' shared_ptr '. –

risposta

6

Se i vincoli lo consentono, è possibile aggiungere un metodo virtuale 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(); 
     // ... // 
    } 
Problemi correlati