2014-07-08 14 views
5

Ich habe ein Problem, bei dem ich ein Objekt kopieren möchte, es aber vermeiden möchte, es zu schneiden.Objekt-Slicing vermeiden C++

DerivedObj derivedObj; 
myFunc(derivedObj); 

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

Gibt es einen Weg, um dies zu umgehen? Ich muss eine Kopie erstellen, da das ursprüngliche Objekt den Bereich verlassen hat, bevor es benötigt wird.

+0

@clcto wie wird es einen Unterschied machen? –

+2

@clcto Das Übergeben eines Zeigers gegen eine Referenz ist kein Problem. Zeiger * und * Referenzen werden NICHT geschnitten. Ziehe Pointer und Referenzen "non-slicable" in Betracht. Das Slicen geschieht auf der Anweisung mit dem 'neuen' Aufruf. –

+1

Soweit ich weiß, haben Sie zwei Hauptoptionen, haben eine virtuelle Methode namens 'clone()' oder können eine Art Besitz von 'obj' zu' myFunc() 'geben, vielleicht mit einem' shared_ptr '. –

Antwort

6

Wenn Ihre Einschränkungen es erlauben, können Sie eine virtuelle Clone Methode hinzufügen.

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(); 
     // ... // 
    } 
Verwandte Themen