|
7 / 7 / 1
Регистрация: 04.12.2009
Сообщений: 42
|
||||||
Как узнать, какого типа объект находится по указателю26.03.2012, 23:31. Показов 23494. Ответов 22
Метки нет (Все метки)
Есть массив указателей базового класса, нужно узнать какие типы этих объектов.
0
|
||||||
| 26.03.2012, 23:31 | |
|
Ответы с готовыми решениями:
22
Как узнать находится ли объект в фокусе Как узнать что находится в переменной типа byte[] |
|
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
|
|
| 26.03.2012, 23:34 | |
|
смотрите описание к оператору dynamic_cast. позволяет кастить указатель на базу к указателю на производный класс с проверкой. если производный имеет нужный тип, то скастится, иначе оператор вернет нуль или кинет исключение при преобразовании ссылок.
1
|
|
|
|
||||||
| 27.03.2012, 01:50 | ||||||
3
|
||||||
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
| 27.03.2012, 06:15 | |
|
Полиморфизм нужен для того, чтобы игнорировать действительный тип объектов и работать только с базовым.
0
|
|
|
4 / 4 / 0
Регистрация: 06.01.2012
Сообщений: 117
|
|
| 12.11.2012, 10:01 | |
|
Если не хочешь разбираться с кастами и полиморфизмом, то заведи переменную в базовом классе флаг и с помощью него можешь узнавать тип уазателя
1
|
|
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,702
|
||||||
| 12.11.2012, 12:19 | ||||||
|
Тут нужна динамическая идентификация типов что-то такое:
Дополнительно смотреть: http://khpi-iip.mipk.kharkiv.e... lava12.pdf http://gcc.gnu.org/onlinedocs/... 2ch39.html http://www.cplusplus.com/refer... type_info/ Определить все данные, тип которых вводится из командной строки Определение введенного типа
0
|
||||||
|
1 / 1 / 1
Регистрация: 22.12.2013
Сообщений: 27
|
|
| 23.01.2015, 19:44 | |
|
Deviaphan, вы давно программируете? Категорически с Вами не согласен. Полиморфизм нужен как для использования общих виртуальных функций, так и для уникальных для каждого потомка. То есть это абсолютно рядовая задача программирования делать коллекцию базовых объектов и в дальнейшем преобразовывать их в потомки для дальнейшей обработки.
Вот один из множества примеров, взятых из реальной жизни: у Вас есть коллекция графических примитивов в виде линий и дуг, основанных на одном общем родительском классе gElement. Попробуйте написать функцию, находящую точки пересечения двух произвольных элементов, принимающую в качестве аргументов ссылки на gElement (double[] Intersection(gElement el1, gElement el2), не прибегая к преобразованию базовых элементов к родительским типам. Добавлено через 23 минуты А по топику полностью согласен с DU - нужно использовать dinamic_cast. Ответ dqrest тоже хорош, можно завести переменную, перечисляющую родительские типы и указывающую явно в какой тип надо преобразовать, что увеличит скорость выполнения при увеличении количества наследников. В этом случае можно будет использовать static_cast или явное преобразование - это еще прирост скорости.
0
|
|
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 23.01.2015, 21:41 | ||
|
А dynamic_cast'ы и прочие "завести переменную" нужны только неосиляторам которые не могут спроектировать систему типов.
0
|
||
|
73 / 69 / 38
Регистрация: 09.10.2012
Сообщений: 238
|
||
| 23.01.2015, 23:53 | ||
|
Или имелось в виду, что решать задачу "Есть массив указателей базового класса, нужно узнать какие типы этих объектов." саму по себе не имеет смысла?
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
|||
| 24.01.2015, 14:09 | |||
|
А ответ на вопрос ТС'а простой - не нужно знать типы этих объектов.
1
|
|||
|
1 / 1 / 1
Регистрация: 22.12.2013
Сообщений: 27
|
||
| 20.02.2015, 16:20 | ||
|
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 20.02.2015, 16:57 | |||
|
А учитывая общую подкованность господина Deviaphan, то можно смело предположить, что он и в 2012 уже был специалистом. --------------------------------------------------------------- 1. Язык си, со своей процедурной парадигмой не имеет никакого отношения к ответа господина Deviaphan. 2. Технология полиморфизм, на которой базируется оо-парадигма, была разработана, что бы реализовать идеому: "закрыт для изменений, открыт для расширений". Другими словами, полиморфизм для того и нужен, что бы избежать необходимости пасти фактические типы, и уйти от километровых свитч-кейсов, и армии ифов. 3. То, как вы предлагаете использовать полиморфизм на корню прибивает идеому, ради которой он и был создан. И прекрасно реализуется на тех же свитч-кейсах (имея при этом все их недостатки). Это дает основание предположить, что вы сами не понимаете ООП. Более того: именно к вам можно обратить ваш собственный тезис: С точки зрения ООП ваш юзкейс нарушает идеому "зарыт для изменений, открыт для расширений", и прекрасно реализуется на обычном процедурном си при помощи свит-кейсов, или конструкций из if/else, имея при этом все их недостатки. Возможно вы предпочитаете писать на чистом С. Возможно вы просто неправильно понимаете идеологию ООП. Но такие коллекции не оправданы с точки зрения ООП, и ломают на корню многие из его возможностей. Что-то подобное в оо-архитектуре красноречивый признак её ущербности.
1
|
|||
|
1 / 1 / 1
Регистрация: 22.12.2013
Сообщений: 27
|
||
| 20.02.2015, 21:47 | ||
|
С теоретической точки зрения да, если нам нужна динамическая типизация, то мы не соблюдаем этот принцип. Но программирование прежде всего имеет смысл с точки зрения практики. И не спроста язык предлагает нам инструменты динамической типизации вроде dinamic_cast и typeid. Можно обойтись и без таких коллекций, только это усложнит реализацию. Лучше рассмотреть на конкретной задаче: Есть 2 контура Contour, состоящих из последовательно соединенных линий Line: Element и дуг Arc: Element. Нам нужно найти точки пересечения этих контуров. Архитектурное решение с применением абстрактных коллекций: Перечисляем элементы первого контура, для каждого из них перечисляем все элементы второго контура и вызываем у них метод PointF pf = el1.Intersect(el2); В методе Intersect каждого типа пишем свич-кейсы. Нарушаем принцип открытости-закрытости (при добавлении новых типов примитивов придется дописывать свич-кейсы в каждом "братском" классе), но простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#). Какую можете предложить альтернативу? (Естественно в приватных функциях контура должны сохраняться возможности вставки, удаления, инверсии элементов, и желательно доступа к элементу по индексу). Добавлено через 39 минут Архитектурное решение с применением абстрактных коллекций: Вызываем метод cont1.Intersect(cont2); Перечисляем элементы первого контура, приводим к производному типу. Для каждого из них перечисляем все элементы второго контура, приводим их и вызываем метод PointF pf = (line1/arc1).Intersect(line2/arc2); Все свич-кейсы пишутся в методе Contour.Intersect. При добавлении новых типов примитивов, нужно будет дописать свич кейсы только этого метода, а ранее написанный код примитивов останется без изменений. В такой реализации не нарушается принцип открытости-закрытости, но остается простота реализации и поддержки, а также скорость выполнения программы при большом количестве элементов (касты делаются быстро, по крайней мере на C#). А вот избавиться от динамической типизации вряд ли получится. Отказываться от абстрактной коллекции тоже смысла не вижу и не считаю это ущербным. В принципах ООП ничего нет про ущербность абстрактных коллекций=)
0
|
||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||
| 20.02.2015, 23:35 | ||
|
1
|
||
|
1 / 1 / 1
Регистрация: 22.12.2013
Сообщений: 27
|
|||
| 21.02.2015, 00:39 | |||
|
Возможно они и лучше по многим аспектам, я пока эти подходы не изучил. Я ищу подход не только для плюсов, но и для C#. Там это скорее всего будет нереализуемо.
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||||||
| 21.02.2015, 01:03 | ||||||||||||
|
Нужно отталкиваться от "способа обобщения". Что у нас есть? Контур, который может состоять из линий, дуг, и может быть ещё чего нибудь придумаем. Что общего у отрезков и дуг? Если мы можем выделить общее у этих двух элементов, например: "отрезок - это примитив состоящий из 2х точек" "дуга - это примитив состоящий из И отрезков" Пойдем дальше в нашем обобщении: отрезок - это контейнер для двух точек Но если так, то совокупность отрезков можно представить в виде списка точек. А значит дуга - это контейнер из И точек. И по аналогии, контур - это так же контейнер из N точек. Итого: вся архитектура сводится всего к двум элементам: точка, и контейнер точек. Дуги, отрезки, квадраты, прямоугольники и прочее - это все опционально. Всего лишь методы "удобного и быстрого" построения типичных фигур:
поиска пересечений для фигур состоящих из И точек. Если не ошибаюсь, то в мире компьютерной графики принцип разбиения любых геометрических фигур на многоугольники называется "адаптивной деградацией". --------------------------------------------------------------------------------------------- Теперь предположим, что в силу специфики задачи мы не можем прибегнуть к адаптивной деградации Предположим, нам нужно делать весьма точные расчеты, и оперировать нужно именно окружностями и настоящими дугами, а вовсе не многоугольниками. (предположим, что так захотел заказчик, и баста! ) В этом случае становится очевидным, что сделать универсальный алгоритм пересечения не получится. И придется реализовать весь комплект уникальных алгоритмов пересечений. Что само по себе уже нарушает идею "закрыт для изменений, открыт для расширений". Требование к задаче "выполнять обработку по уникальным способом в зависимости от типов участников", уже противоречит идее полиморфизма. И с этим мы бессильны, что либо поделать. Мы можем лишь облегчить сопровождение такого подхода. Например, мы можем построить решение, которое частично может поспособствовать универсальности решения. Допустим, если линия не умеет пересекаться с окружностью (программисты ещё не успели доделать этот алгоритм, но уже сейчас нужно показать промежуточные результаты работы), то линия может попросить окружность "адаптивно деградироваться", и в итоге отработает универсальный алгоритм. Кроме того, вместо свитч-кейсов и армии ифов, мы можем задействовать более быстрый вариант выборки "кто-с-кем" основанный на полиморфизме. Что ко всему прочему позволит выполнять проверку типобезопасности времени компиляции. И этот фактор очень важен, поскольку избавляет нас от использования медленного динамик_каст, медленных свитч-кейсов, медленных ифов, упрощает расширение системы, и в конечном счете ошибки времени компиляции - это всегда лучше, чем ошибки рантайма. Ничайно позабыть что-то уже не получится. Я не буду вдаваться в подробности модели самого контейнера графических элементов. В контексте нашей беседы главное - продемонстрировать диспетчеризацию. Ниже представленный код - пример-иллюстрация одного из возможных решений: http://rextester.com/JAIUXZ12714
2
|
||||||||||||
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||||
| 21.02.2015, 01:26 | ||||||
|
Ну как вариант можно не городить велосипеды и заюзать boost::variant
2
|
||||||
|
1 / 1 / 1
Регистрация: 22.12.2013
Сообщений: 27
|
||
| 21.02.2015, 15:19 | ||
|
Спасибо hoggy, мне очень понравилась такая реализация. Волшебный указатель this при вызове виртуального метода Intersect сам уже посылает нужный тип в функцию, действительно очень удобно, и работает также и на шарпе. Можно назвать это автоматическим приведением типа объекта посредством виртуальной функции. Небольшой минус в интерфейсе - нужно заводить две публичные функции для одного действия.
А вообще такой подход наверное применим во многих случаях в моих задачах.
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||||||
| 21.02.2015, 15:57 | ||||||||
|
Добавлено через 33 минуты который выполняя проверки времени компиляции позволит разрулить динамику без необходимости обязательно от чего то там наследоваться, и реализовывать какие то методы. Дизайн например мог бы выглядеть так:
зы: это лишь концепт-дизайн. Я ничего подобного ещё не делал. Однако, мои знания шаблонов с++ дают мне основание полагать, что подобный дизайн реален. Хотя работа не на один вечер.
0
|
||||||||
| 21.02.2015, 15:57 | |
|
Помогаю со студенческими работами здесь
20
Forbids casting в dlsym - ISO C++ не поддерживает приведение типа указателя на функцию к указателю на объект Как узнать из какого окна и какого процесса пришло сообщение? Подсчитать, сколько файлов какого типа находится на логическом диске по выбору пользователя От какого типа каждый объект прямо или косвенно является производным в .Net? Можно ли узнать если объект находится на объекте? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
||||
|
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод
Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод.
Thinkpad X220 Tablet —. . .
|
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта
Симптом:
После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
|
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
|
Новый ноутбук
volvo 07.12.2025
Всем привет.
По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне:
Ryzen 5 7533HS
64 Gb DDR5
1Tb NVMe
16" Full HD Display
Win11 Pro
|
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
|
|
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
|
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов
На странице:
https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/
нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
|
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов.
. . .
|
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
|
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
|