Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Каст vector<shared_ptr<D>> в vector<shared_ptr<B>>


Автор: kosmonaFFFt 2.10.2012, 13:28
Доброго времени суток...

Есть классы Base и Derived : public Base, есть класс, принимающий в конструкторе const ::std::vector<::std::shared_ptr<Base>>&, и в другом месте имеется ::std::vector<::std::shared_ptr<Derived>>. Можно ли как-нибудь по хитрому скастовать вектор смартпойнтеров с наследниками к вектору смартпойнтеров с предками? Или каким-либо образом изменить конструктор класса, который сейчас принимает вектор смартпойнтеров предков, чтобы он мог принимать и наследников?

Автор: Fazil6 2.10.2012, 13:46
ну очевидно нужен еще один конструктор. Тока  как-то нехорошо попахивает эта задача

Автор: kosmonaFFFt 2.10.2012, 13:50
Хотелось бы, чтобы класс, принимающий вектор предков, ничего не знал о наследниках... А то если появятся другие наследники, придется добавлять еще конструкторов...

Автор: mes 2.10.2012, 18:31
kosmonaFFFt, по сути, вектора с Наследниками не должно быть в открытом доступе.. 
а так, заведите функцию конвертор, принимающую один вектор и возвращающую другой.. 

Автор: kosmonaFFFt 2.10.2012, 18:35
Не хотелось бы, так как создание того объекта будет происходить в цикле непонятно сколько раз... Если писать конвертер, прдется копировать данные из одного вектора в другой, что ИМХО небыстро...

Автор: mes 2.10.2012, 18:37
Цитата(kosmonaFFFt @  2.10.2012,  17:35 Найти цитируемый пост)
 Если писать конвертер, прдется копировать данные из одного вектора в другой, что ИМХО небыстро... 

фактически копирование указателей.. 

Цитата(kosmonaFFFt @  2.10.2012,  17:35 Найти цитируемый пост)
 так как создание того объекта будет происходить в цикле непонятно сколько раз..

создавайте сразу вектор базовых..

Автор: bsa 2.10.2012, 20:16
kosmonaFFFt, зачем держать вектор указателей на потомки, когда можно просто использовать указатели на базовый тип?

Автор: kosmonaFFFt 2.10.2012, 20:45
У потомков помимо функционала базового типа, есть еще доп. функционал, и в том месте, где потомки создаются, и где они потом будут использоваться, он нужен, а в месте промежуточной обработки нет...

Автор: bsa 2.10.2012, 21:36
одно могу сказать, у тебя проблема с архитектурой программы.

Автор: xvr 3.10.2012, 12:06
Цитата(kosmonaFFFt @  2.10.2012,  13:28 Найти цитируемый пост)
 Или каким-либо образом изменить конструктор класса, который сейчас принимает вектор смартпойнтеров предков, чтобы он мог принимать и наследников? 

Изменить сам клас - сделать его шаблонным, принимающим Base и Derived в качестве параметра шаблона.

Автор: kosmonaFFFt 3.10.2012, 12:30
В общем изменил сам класс - сделал шаблонный конструктор, принимающий итераторы, а т. к. shared_ptr имеет шаблонный оператор присваивания, подходят итераторы от любых наследников...

Автор: Fazil6 4.10.2012, 14:27
Цитата(kosmonaFFFt @  2.10.2012,  20:45 Найти цитируемый пост)
У потомков помимо функционала базового типа, есть еще доп. функционал, и в том месте, где потомки создаются, и где они потом будут использоваться, он нужен, а в месте промежуточной обработки нет... 

говорил же , что плохо это пахнет...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)