Russian Qt Forum
Июнь 21, 2018, 17:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Тупой вопрос по касту элементов вектора.  (Прочитано 945 раз)
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2446

чтоб работа волком не казалась :)


Просмотр профиля WWW
« : Декабрь 30, 2017, 21:21 »

Всем привет,

вот такая задача под Новый Год:
передать в метод вектор типа std::vector<B*>, если сигнатура метода выглядит как setVector(std::vector<A*>), где A - суреркласс B.
Дополнительное условие: создание временного std::vector<A*> и поэлементного копирования в него элементов не разрешено ни в каком виде (ни явно, ни неявно).
Каковы идеи?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2545


Просмотр профиля
« Ответ #1 : Декабрь 30, 2017, 21:44 »

Поменять сигнатуру на array_view<A> и конструировать array_view<A>(vec.data(), vec.size());
« Последнее редактирование: Декабрь 30, 2017, 21:47 от Авварон » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10047


Просмотр профиля
« Ответ #2 : Декабрь 31, 2017, 07:44 »

Сишный каст и все дела (нечего строить из себя целку)
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2545


Просмотр профиля
« Ответ #3 : Декабрь 31, 2017, 13:58 »

Почитал Гугл, мое решение с вью ничем не лучше. В общем случае, так делать нельзя, потому что указатели наследника и базового класса могут не совпадать, поэтому нужно копировать (а точнее, перевычислять адреса для каждого объекта)
« Последнее редактирование: Декабрь 31, 2017, 14:24 от Авварон » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10047


Просмотр профиля
« Ответ #4 : Декабрь 31, 2017, 14:17 »

Да, верно, при множ наследовании адреса могут быть разные, копирование неизбежно. Нечего было возвращать вектор указателей на наследника
Записан
m_ax
Neo
******
Offline Offline

Сообщений: 1785



Просмотр профиля
« Ответ #5 : Декабрь 31, 2017, 14:31 »

Продумывать нужно архитектуру перед тем как писать.
Сигнатуру метода нужно менять, чтоб он итераторы принимал:
Код
C++ (Qt)
template <class Iter>
void setVector(Iter first, Iter second)
 
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2446

чтоб работа волком не казалась :)


Просмотр профиля WWW
« Ответ #6 : Декабрь 31, 2017, 15:48 »

Сигнатуру метода нужно менять, чтоб он итераторы принимал:

а чем это спасет то по сути?
в этом варианте придется делать новую имплементацию метода setVector в классе-наследнике, по сути будет то же копирование...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

http://sintegrial.com - всякий хороший Qt софт (был Грустный )
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 10047


Просмотр профиля
« Ответ #7 : Декабрь 31, 2017, 16:18 »

..по сути будет то же копирование...
И чем оно здесь плохо? Часто специально заряжают именно контейнер указателей (а не самих данных) чтобы развязаться с копированием, сортировкой и др.  А темплейты может есть смысл рисовать для создателя исходного вектора (чтоб  мог возвращать и так и сяк)
Записан
_Bers
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #8 : Январь 07, 2018, 18:32 »

Сишный каст и все дела (нечего строить из себя целку)
+1
Записан
_Bers
Крякер
****
Offline Offline

Сообщений: 319


Просмотр профиля
« Ответ #9 : Январь 07, 2018, 18:35 »

Продумывать нужно архитектуру перед тем как писать.
Сигнатуру метода нужно менять, чтоб он итераторы принимал:
Код
C++ (Qt)
template <class Iter>
void setVector(Iter first, Iter second)
 
+1
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.107 секунд. Запросов: 22.