2016-01-14 2 views
4

У меня есть объект класса, который содержит vector<unique_ptr>. Я хочу, чтобы копия этого объекта запускала неконстантные функции. Оригинальная копия должна оставаться const.Уникальная копия вектора <unique_ptr>

Как выглядит конструктор копирования для такого класса?

class Foo{ 
public: 
Foo(const Foo& other): ??? {} 

std::vector<std::unique_ptr> ptrs; 
}; 
+0

«Уникальный» здесь не означает «необычный». – molbdnilo

+0

@molbdnilo. Вы можете скопировать данные, на которые указывает уникальный_ptr. 'data = * ptr;' –

+0

Уникальный означает только тот. Копирование чего-то уникального - это противоречие в терминах. Я подозреваю, что вам нужны 'std :: shared_ptr', если вам нужны копии. – Galik

ответ

8

Вы не можете просто копируйте std::vector<std::unique_ptr> потому std::unique_ptr не копируемый поэтому он будет удалить конструктор вектора копирования.

Если вы не измените тип хранящийся в векторе, то вы могли бы сделать «копию», создав совершенно новый вектор как

std::vector<std::unique_ptr<some_type>> from; // this has the data to copy 
std::vector<std::unique_ptr<some_type>> to; 

for (const auto& e : from) 
    to.push_back(std::make_unique<some_type>(*e)); 

Теперь to отдельная копия from и могут быть изменены независимо друг от друга ,

+0

Это то, что я хочу. Спасибо –

+1

@brian Спасибо за обнаружение недостающей ссылки – NathanOliver

+0

Что происходит, когда векторы уничтожаются, и все unique_ptrs пытаются удалить объекты, на которые они указывают? –