106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
1 | |
Сравнение производных классов29.06.2014, 19:15. Показов 4877. Ответов 24
Метки нет (Все метки)
Друзья!
Пусть у меня есть базовый класс S. У него есть два наследника A и B. Как мне скидывать, например в set, указатели (шаредпэтэры например) на объекты классов A и B так, чтобы сначала шли объеты класса A, затем объекты класса B? Понятно как сравнивать объекты класса только A или только B между собой, а как сравнивать объекты классов A и B между собой? Потенциально может быть и так что у A и B тоже будут наследники, например Aa, Ab, Ba и Bb. И тогда надо будет сравнивать все объекты между собой (S, A, B, Aa, Ab, Ba, Bb). Как такое делается? Добавлено через 11 минут У мея есть два варианта: 1. В класс S добавить enum, и в зависимости что за объект объявляем, выставлять IDшник этого объекта. таким образом у каждого обекта будет свой IDшник (возможно они будут повторяться, если например будет несколько объектов одного класса). Ну собственно сравнивать объекты по этому ID. Вроде норм, но кажется что этот ID это какой-то костыль 2. Сделать один супер контейнер, в котором указатели на контейнеры, каждый из которых хранит объекты только своего типа. Этот вариант мне нравится - не нужно хранить никакие ID и прочую "лишнюю" инфу, но вот как супер контейнер узнает объект какого типа ему передали и в какой контейнер его пушнуть? собственно это такой же вопрос как и в первом посте.
0
|
29.06.2014, 19:15 | |
Ответы с готовыми решениями:
24
Наследование классов. Копирование производных классов Использование базовых и производных классов Файлы и объекты производных классов Массив объектов разных производных классов |
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
|
29.06.2014, 19:24 | 2 |
привести объект производного класса к базовому, сравнить приведенные объекты. dinamyc_cast вам в помощь
0
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 19:35 [ТС] | 3 |
Хорошо, а если я хочу в будущем менять порядок следования объектов в контейнере?
Как я понял, вы предлагаете любой указатель приводить к указателю на базовый класс. Ок, привел. А как их потом сравнивать? Как понять что объект ЭТОГО типа "меньше" объекта вот ЭТОГО типа?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
29.06.2014, 19:37 | 4 |
А можно чуть больше контекста? Почему было принято решение именно так делать?
PS Мне как-то приходилось поддерживать гетерогенную очередь с приоритетами... Отделался добавлением в каждый класс свойства "Приоритет".
1
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 19:43 [ТС] | 5 |
0x10, ну собственно ваш способ это и есть мой первый метод, верно?
Пока еще не принято никакого решения. Есть только задача. Я думаю как бы это решить получше. В целом задача как в первом посте. Есть иерархия классов. Может быть создан объект любого из классов. И хочется хранить объекты всех типов в одном контейнере (ну или в нескольких, главное чтобы для пользователя было прозрачно, пушнул указатель в контейнер, а как он там хранится, по барабану). При этом я, например, хочу выводить весь контейнер в файлик, в заданном МНОЮ порядке. апример, сначала все объекты класса S, затем A, затем B и так далее.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
29.06.2014, 19:59 | 6 |
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
29.06.2014, 20:07 | 7 |
Отсортировать указатели с использованием своей функции сравнения и вывести. Лучше не стоит использовать std::set, если требуется какая-то своя сортировка только для целей вывода в определенном порядке.
1
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
||||||
29.06.2014, 20:08 [ТС] | 8 | |||||
че нить такое?
0
|
377 / 228 / 79
Регистрация: 24.11.2009
Сообщений: 695
|
||||||
29.06.2014, 20:09 | 9 | |||||
простите, не правильно вас понял вначале.
Посмотрите:
Код
1B 3Ch1 3Ch2 3Ch3 0 1
1
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
29.06.2014, 20:11 | 10 |
Kukurudza, ну ок. Только я бы еще этот приоритет сделал бы static - к чему дублировать его в каждом объекте.
1
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 20:13 [ТС] | 11 |
Vladimir., ваш метод это собственно такой же что и мой. только один из них более наглядный (в зависимости от опыта кодера )
0x10, ну да, разумеется. всем плюсанул. спасибо.
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
29.06.2014, 20:13 | 12 |
Vladimir., ну это хак, нецелевое использование возможностей языка. Нет гарантий, что при использовании другого компилятора будет полностью аналогично.
0
|
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
|
||||||
29.06.2014, 20:21 | 13 | |||||
Сообщение было отмечено Kukurudza как решение
Решение
0
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 20:22 [ТС] | 14 |
Voivoid, пожалуй, вы лучший
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
||||||
29.06.2014, 20:24 | 15 | |||||
Voivoid, у меня когда-то примерно так и было реализовано) А потом совесть замучила за то, что везде дублируется функция, отличающаяся не поведением, а только данными.
В итоге получилось что-то такое:
1
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 20:27 [ТС] | 16 |
0x10, хитрец
0
|
106 / 87 / 13
Регистрация: 29.08.2012
Сообщений: 539
|
|
29.06.2014, 20:31 [ТС] | 18 |
Tulosba, а что не так?
0
|
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
|
|
29.06.2014, 20:31 | 19 |
Tulosba, все можно - главное, идея показана)
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
29.06.2014, 20:33 | 20 |
Подход одинаковый (но для разных целей).
0
|
29.06.2014, 20:33 | |
29.06.2014, 20:33 | |
Помогаю со студенческими работами здесь
20
Функция создающая объекты производных классов Множественное наследование. Построение производных классов Конструктор по умолчанию для производных классов Конструктор копирования производных классов: для чего это нужно? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |