2015-06-03 1 views
3

У меня есть класс (C) с vector из unique_ptr s в абстрактный класс (A). Это связано с тем, что C должен работать со всеми классами типа A, то есть с его дочерними элементами.Копировать конструктор для класса с unique_ptr в абстрактный класс как член

Проблема в том, что я не могу понять, как написать конструктор копирования для C, так как тип объектов, на которые указывают указатели, неизвестен во время компиляции. На самом деле это кажется мне невозможным. Кто-нибудь может подтвердить, что это невозможно? Есть ли у вас какие-либо предложения по решению проблемы? Это слишком ужасно, чтобы иметь класс без конструктора копирования?

+3

* Это слишком ужасно, чтобы иметь класс без конструктора копирования? * Нет, все в порядке. Например, 'unique_ptr' не имеет его, как вы могли заметить. –

+3

Одним из решений является добавление функции-члена 'virtual A * clone() = 0;' to 'A'. – Pubby

+1

[Сделайте то, что сказал Pubby] (https://isocpp.org/wiki/faq/abcs#copy-of-abc-via-clone), но только если вам нужно, чтобы 'C' был создан для копирования. Нет ничего плохого в том, что у вас есть классы, не подлежащие копированию, это полностью зависит от вашего варианта использования. – Praetorian

ответ

0

Вы не сказали, имеете ли вы контроль над кодом для абстрактного класса и классов, полученных из него. Если да, то самый простой способ - предоставить чистый виртуальный метод Clone в абстрактном классе и реализовать его в производных классах. Этот метод должен обрабатывать создание правильных копий. К сожалению, поскольку unique_ptr не копируется, вам необходимо выполнить итерацию по вашему вектору и создать копии, позвонив по номеру Clone.

1

Ну, так std::unique_ptr<T> не копируемые, и, таким образом, std::vector<std::unique_ptr<T>> не копируемый, и, таким образом, C который имеет std::vector<std::unique_ptr<T>> как член не должен быть по умолчанию-копируемое.

Вы можете, конечно, реализовать экземпляр-конструктор, который делает глубокую копию T, но это зависит от того, что на самом деле есть T.

+0

Это можно сделать для не-абстрактных классов. См. Https://stackoverflow.com/questions/16030081/copy-constructor-for-a-class-with-unique-ptr – Eliad

+0

@Furihr, который также требует, чтобы тип был полным, я думаю –

Смежные вопросы