I am not sure what the best / cleanest solution to making a deep copy of an object with a smart pointer containing inherited objects is. To boil it down, given the following code
class A {};
class D1 : public A{
public:
int x1 = 0;
};
class D2 : public A {
public:
int x2 = 2;
};
class V {
public:
V(A* a) : ptr(a) {}
std::unique_ptr<A> ptr;
};
void run() {
std::vector<V> v;
v.push_back(V(new D1));
v.push_back(V(new D2));
/// I want to make a deep copy of v here
}
where the vector v
contains both objects of type D1
and D2
, what is the shortest / most elegant way to make a deep copy of v
? I can think of two ways, both with some drawbacks:
- create a virtual
A* clone()
method in the base class and overload it in each inherited class (as described here). Drawback: the clone method needs to be instantiated in every inherited class and there may be multiple. - create a copy constructor/assignment operator for
V
. Usingdynamic_cast<D1/D2>
, check which kind of inherited object is attached and make a copy for that specific type. Drawback: one needs to go through all inherited classes in the copy constructor ofV
.
Aucun commentaire:
Enregistrer un commentaire