Класс с виртуальными функциями обычно не имеет конструктора копирования, потому что копировать объекты таких классов обычно не имеет смысла. Разрешение конструктора копирования открывает двери для всевозможных опасных ошибок, связанных с нарезкой.
Другими словами (выделено мной):
Я делаю что-то под названием "глубокое копирование", метод clone() требует вернуть новый экземпляр типа производного класса, используя его конструктор копирования
Нет, он абсолютно не требует конструктора копирования. Это должно предотвратить копирование, удалив конструктор копирования и оператор присваивания копии.
Вот пример того, как это должно быть сделано. Обратите внимание, что я сделал деструктор виртуальным и добавил несколько примеров членов. Я также изменил подпись clone
на const
и использовал override
для включения дополнительных проверок компиляции.
class Device : public Object {
public:
Device() {}
Device(const Device&) = delete;
Device& operator=(const Device&) = delete;
virtual ~Device() {}
virtual Device* clone() const = 0;
};
class Radar : public Device {
public:
Radar(int i, const std::string& s) : i(i), s(s) {}
Radar* clone() const override
{
return new Radar(i, s);
}
private:
int i;
std::string s;
};
В зависимости от того, что требуется вашему дизайну, конструктор Radar
, вызываемый clone
, также может быть private
.
Другое дело, что вы можете рассмотреть дизайн на основе std::unique_ptr
:
class Device : public Object {
public:
Device() {}
Device(const Device&) = delete;
Device& operator=(const Device&) = delete;
virtual ~Device() {}
virtual std::unique_ptr<Device> clone() const = 0;
};
class Radar : public Device {
public:
Radar(int i, const std::string& s) : i(i), s(s) {}
std::unique_ptr<Device> clone() const override
{
return std::make_unique<Radar>(i, s);
}
private:
int i;
std::string s;
};
person
Christian Hackl
schedule
30.10.2015