Я немного зациклен на том, как вы достигнете чего-то подобного на C++. У меня такое чувство, что это может быть связано с моей архитектурой.
Предположим, у меня есть гараж в Монреале, и в этом гараже есть разные машины. Обычно я бы пошел с вектором указателей на автомобиль базового класса. Вот проблема, хотя, я тогда хочу глубоко скопировать гараж и открыть его в Майами. Кроме того, у автомобилей Saab должен быть другой конструктор копий, но с той же подписью. Будут другие исключения, подобные этому по дороге. Я не знаю, что в гараже заранее. Вот код, который у меня есть.Хранить переменное количество объектов переменного числа производного класса и глубоко скопировать их
//base class
class Car
{
public:
Car(int speed);
private:
int speed;
}
class Garage
{
public:
Garage(){};
//copy constructor of the garage
Garage(const Garage &toCopy)
{
for(int i=0;i<toCopy.cars.size();i++)
{
ReceiveCar(*cars[i]);
}
}
vector<std::shared<Car>> cars;
template <typename T>
T* ReceiveCar()
{
std::shared_ptr<T> ptr = std::make_shared<T>();
cars.push_back(ptr);
return ptr.get();
}
T* ReceiveCar(Car &toCopy)
{
std::shared_ptr<T> ptr = std::make_shared<T>(toCopy) cars.push_back(ptr);
return ptr.get();
}
}
class Saab : public Car
{
public:
Saab(int speed)
:Car(speed)
{
DoWork();
};
}
class AstonMartin: public Car
{
public:
AstonMartin(int speed)
:Car(speed)
{
DoImportantStuff();
};
AstonMartin(const AstonMartin& toCopy)
:Car(toCopy.speed)
{
DoImportantStuff();
};
}
Конечно, используемый конструктор копирования является неявным из автомобиля. Можно ли назвать производный класс «одним» вместо динамического кастинга между ifs/elses для каждого исключения в правиле. Может быть, как-нибудь сохранить каждый производный класс с указателем?
PS: Я знаю, что я не должен возвращать исходные указатели, но деструкторы для автомобилей являются частными в моем коде, поэтому shared_pointers по-прежнему безопасны.
Посмотрите на виртуальный клон. – Jarod42
Как насчет использования простого контейнера типа 'std :: vector'? –
dupe of http://stackoverflow.com/questions/5148706/copying-a-polymorphic-object-in-c или http://stackoverflow.com/questions/5731217/how-to-copy-create-derived-class -instance-from-a-pointer-to-polymorphic-base-c – NathanOliver