|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|||||||||||
Достать нужный объект из контейнера28.05.2014, 11:05. Показов 1001. Ответов 9
Метки нет (Все метки)
Возник вопрос, отчасти я сам решил(получил нужный результат), но очень коряво.
Мне нужно достать нужный объект из контейнера на абстрактный класс в методах классов наследниках. Если вкратце, то у меня есть контейнер указателей на абстрактный класс, в котором хранятся различные объекты классов наследников, в моём случае это класс "Метеорит" и "Лазер", со временем будут ещё. Хотелось бы реализовать взаимодействие между ними как то так
Сейчас у меня как ни странно всё работает - пока видов объектов всего 2.
Meteor = (CMeteor*)Object; Насколько законное такое присваивание типа? Что будет с объектами из контейнера, которые не CMeteor типа? И можно ли каким то образом проверить какой объект какого типа мы получаем в качестве аргумента, чтобы не лепить такие грабли? Чтобы сложность проверки была линейная - N Объектов - N проверок, а не увеличивалась от количества типов содержащихся в контейнере.
0
|
|||||||||||
| 28.05.2014, 11:05 | |
|
Ответы с готовыми решениями:
9
Как достать указатель на объект из контейнера set Если объект добавлять в 2 контейнера, то в них будет ссылка или новый объект? Достать нужный кадр |
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 28.05.2014, 11:57 | |
|
Skaarj, dynamic_cast, но это все не очень честно говоря хорошо. Можно визиторы реализовать, но кол-во визиторов будет зависит от реального кол-ва классов, то есть много кода, если много классов.
По-хорошему в С++ простого решения данной траблы нет.
1
|
|
|
2 / 2 / 4
Регистрация: 28.06.2013
Сообщений: 56
|
|||||||||||
| 28.05.2014, 13:10 [ТС] | |||||||||||
|
Спасибо за наводку. Ввёл новую виртуальную функцию и определил для каждого наследника. В моём случае не так уж и много классов, так что вполне нормальный вариант. И главное dynamic_cast стал работать как надо - до этого выбивал при не совпадение типов
Я так понимаю это и есть визиторы?
0
|
|||||||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||||||
| 28.05.2014, 13:36 | ||||||
|
Skaarj, Нет, это не визиторы.
ObjectType предельно бесполезен, ибо dynamic_cast вернет 0, если тип не совпадает.
Прочитать про Посетитель можно тут: http://ru.wikipedia.org/wiki/%... 8%D1%8F%29 Добавлено через 3 минуты Хотя наверное тут лучше будет какая-никакая реализация мультиметодов.
1
|
||||||
|
|
||||||
| 28.05.2014, 13:42 | ||||||
|
ForEveR, решение есть - выбросить из головы наследование, отделить физику от прочей логики объекта. Например,
1
|
||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 28.05.2014, 13:47 | |
|
Kuzia domovenok, Я не могу уловить суть данного решения, ибо код написан непонятно как. Можно чуть подробнее все же? Если бы BBody был бы enum я бы еще что-то мог понять (хотя это никак не решает проблему и не избавляет от RTTI), но в этом случае как-то нет.
0
|
|
|
|
|||||||
| 28.05.2014, 14:00 | |||||||
|
Объясняю - мой код вообще не эту проблему решает и не отвечает на этот вопрос. Объясняю далее - каждый объект содержит Bounding Body. Обычный объект, который ни от чего не наследуется, который содержит например, просто AABB метеора. Что не ясно? Вот когда у тебя пошли использоваться какие-то стрёмные касты и попытки зачем-то выяснить в динамике тип объекта - вот это уж точно говнокод пошёл.
0
|
|||||||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
||
| 28.05.2014, 14:05 | ||
|
Kuzia domovenok, То есть лазеры отдельно, метеоры отдельно, что-то там еще отдельно? Ну, вцелом все ясно. Уход в сторону уютной сишечки, почему бы и нет.
Добавлено через 1 минуту
0
|
||
|
|
||
| 28.05.2014, 14:10 | ||
|
i->getBoundingBody() Типичная композиция. BoundingBody - поле класса CObject, а от класса CObject наследуются остальные!
0
|
||
|
В астрале
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
|
|
| 28.05.2014, 14:15 | |
|
Kuzia domovenok, Окей, с доводами согласен. А как это решает проблему ТС? Предоставь пожалста код, который выполняет то что хотел ТС, с теми изменениями которые ты предложил.
0
|
|
| 28.05.2014, 14:15 | |
|
Помогаю со студенческими работами здесь
10
Достать, объявить объект Достать объект из обработчика в метод. Что можно возвратить из функции если нужный объект не создан
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: при создании документов установить период списания автоматически. . .
|
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2.
Задача: вывести данные из ТЧ нетипового документа. . .
|
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению.
На форме документа создается. . .
|
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
|
|
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
|
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
|
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию.
2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
|
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
|