2016-01-15 3 views
0

У меня есть класс customClass1 со свойством std::vector<std::shared_ptr<customClass2>>.Создайте копию объектов, на которые указывают элементы вектора shared_pointers

Как я могу сделать копию customClass1 объекта, который содержит указатели на идентичных копий объектов указаны по элементам первого std::vector<std::shared_ptr<customClass2>>?

I не хочу просто сделать копии указателей, содержащихся в векторе. Я хочу на самом деле сделать копии объектов, на которые указывают указатели, а затем указать указатели на эти новые объекты, сохраненные в моем втором векторном свойстве объекта customClass1.

+1

Немного непонятно, о чем вы спрашиваете. Общий указатель может быть разыменован (например, с использованием оператора '*'), чтобы создать копию содержащегося объекта, что они хранятся в векторе, как правило, не имеет значения. –

+0

Наверное, я спрашиваю, есть ли способ сделать это без повторения каждого элемента и разыменования, т. Е. Автоматически создавать копии объектов с указателем, но с новыми указателями. – NewDogOldTricks

+0

Нет, это невозможно. Простая копия вектора копирует shared_ptr не объекты, содержащиеся в них. –

ответ

8

Что вам нужно сделать, это перебрать вектор, который вы хотите скопировать, и создать новые shared_ptr s, которые имеют то же значение, что и основной объект в векторе, из которого вы копируете. Вы можете сделать это с помощью:

std::vector<std::shared_ptr<customClass2>> original; // this has the data to copy 
std::vector<std::shared_ptr<customClass2>> copy; 
copy.reserve(original.size()); // prevent reallocations 

for (const auto& e : original) 
    copy.push_back(std::make_shared<customClass2>(*e)); 

Если вы имеете дело с полиморфным типом это будет порезать объект как у вас есть указатель на базу, так только бас часть будет скопирована. Если вы работаете с полиморфным типом, вы можете создать функцию клонирования virtual и использовать clone() для копирования объекта. Для получения дополнительной информации см. What is a “virtual constructor”?isocpp.org FAQ

+0

Итак, мне нужно итерации вручную через вектор и разыменовать их для создания копий? Нет ли способа автоматического создания копий объектов с указателем, но с новыми указателями? Что делать, если я использовал 'unique_pointer'? – NewDogOldTricks

+1

@NewDogOldTricks Чем бы вы не смогли его скопировать. – SergeyA

+0

@NewDogOldTricks Это была бы такая же ситуация. Вы можете сделать это с помощью 'std :: tranform', но в основном это будет одно и то же, и вам нужно будет использовать лямбда для создания копии. – NathanOliver