| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 |
| Не хотелось бы, так как создание того объекта будет происходить в цикле непонятно сколько раз... Если писать конвертер, прдется копировать данные из одного вектора в другой, что ИМХО небыстро... |
| Автор: 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 | ||
Изменить сам клас - сделать его шаблонным, принимающим Base и Derived в качестве параметра шаблона. |
| Автор: kosmonaFFFt 3.10.2012, 12:30 |
| В общем изменил сам класс - сделал шаблонный конструктор, принимающий итераторы, а т. к. shared_ptr имеет шаблонный оператор присваивания, подходят итераторы от любых наследников... |
| Автор: Fazil6 4.10.2012, 14:27 | ||
говорил же , что плохо это пахнет... |