2015-05-10 3 views
1

Я пытаюсь скопировать определенные элементы из одного вектора в другой вектор, который содержит объекты shared_ptr.Скопируйте элементы из одного вектора в другой вектор

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

this->listEnvironment.insert(this->listEnvironment.end(), this->listEnvironmentStatic.begin(), this->listEnvironmentStatic.end()); 

Использование std :: copy и изменение размера второго вектора также не работает.

Посмотрите на следующий пример:

std::vector<std::shared_ptr<Environment>> listEnvironmentStatic; 
std::vector<std::shared_ptr<Environment>> listEnvironment; 

Теперь давайте говорить у меня есть несколько элементов в listEnvironmentStatic, что я хочу скопировать на listEnvironment (который всегда содержит, по меньшей мере, 1 объект), как бы я уникальная копия и все еще сохраняйте listEnvironmentStatic в случае, если игрок снова хочет перезагрузить карту?

+0

Я не думаю, что вы должны использовать 'shared_ptr' в контейнерах, таких как' vectors'. См. Например, [Использует std :: vector > антипаттерн?] (Http://stackoverflow.com/q/24085931) и [shared_ptr с вектором] (http://stackoverflow.com/д/10790161). – jww

+0

Вы хотите добавить в 'listEnviroment' или заменить все в нем? – thelink2012

+0

И если list2 всегда содержит один объект, почему это вектор? –

ответ

2

Если вы хотите новые экземпляры, которые являются копиями из исходного вектора, вы можете использовать:

for (const auto& e : listEnvironmentStatic) 
    listEnvironment.push_back(std::make_shared<Environment>(*e)); 
+1

Что делать, если среда является абстрактным базовым классом? –

+2

@nilo В этом случае вам нужно добавить некоторый метод 'clone()' в класс и его производные классы, которые могут предоставить копию. Каждый (самый производный) класс знал бы, как создать копию самого себя (используя 'std :: make_shared (* this);') и вернуть общий указатель из 'clone()'. Затем используйте 'listEnvironment.push_back (e-> clone());'. –

+0

Итак, в основном добавьте виртуальный std :: shared_ptr Clone() = 0; И затем выполните std :: shared_ptr Clone() {return std :: make_shared (* this); }? –

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