2016-05-21 3 views
-1

Мне нужно скопировать std::unique_ptr<Interface> некоторого интерфейса Interface.Копирование std :: unique_ptr интерфейса

This post суммирует это хорошо, но это не работает в моем случае, потому что Interface не имеет доступного конструктора.

Пример:

//Pointer to copy 
std::unique_ptr<Interface> ptr = std::make_unique<Interface>(); 

//error: incomplete type is not allowed 
std::unique_ptr<Interface> copy{ new Interface(*ptr.get().data) }; 

Есть ли способ глубокой копии ptr в copy?

+2

что такое определение 'Interface'? –

+0

Что значит «Мне нужно скопировать» _? 'std :: unique_ptr' не может быть скопирован по назначению. Если вам нужен новый экземпляр интерфейса, создайте новый. –

+0

@JohnSmith Я бы заподозрил что-то абстрактное. –

ответ

3

Это проблема с вашим классом Interface, а не unique_ptr. Ваш класс Interface не может быть построен на основе разыменования возвращаемого значения Interface::data.

Предположительно, Interface является копируемым и не полиморфным. Если это так, вы просто скопировали его: make_unique<Interface>(*ptr). И если это невозможно для копирования, то вы не можете скопировать Interface. Если это полиморфный тип, то у вас нет возможности скопировать его правильно, если только тип явно не закодирован, чтобы разрешать такие вещи.

+0

** - 1 ** «Если [интерфейс является конструктивным для копирования], вы просто скопировали его конструкцию: make_unique (\ * ptr)" говорит OP использовать техническую лазейку, которую он не понимает, так это то, что * ломтик * объект, который он хочет скопировать. Очень нехороший совет. –

+0

@ Cheersandhth.-Alf: Добавлена ​​заметка о полиморфных типах. –

3

Добавить

virtual std::unique_ptr<Interface> clone() const = 0; 

Для Interface. Внедрите его в окончательный класс реализации интерфейса с помощью:

virtual std::unique_ptr<Interface> clone() const override final { 
    return std::make_unique<Implementation>(*this); 
} 
+0

Я предполагаю, что это будет возможно, но «Интерфейс» - из библиотеки, и я не могу его изменить. Спасибо, хотя – Rakete1111

+0

Кроме того, нет никакой причины сделать эту функцию-член. Так же легко написать функцию 'unique_ptr_clone', которая будет клонировать любой' T', который можно скопировать. –

+2

@NicolBolas: Нет, функция должна быть виртуальной. Отдельная функция просто нарезала бы объект. –

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