![]() |
|
Модераторы: bsa |
![]()
|
|
| Merlin_ua |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 22.11.2006 Репутация: нет Всего: нет |
Добрый день!
Есть задача: создать связный список, данные которые будет содержать узел списка могут быть разные. В основном это различного рода структуры и классы. Я сделал следующим образом (пример сильно упрощен):
Ну и по существу. В программе могут существовать различные списки, узлы которых содержат различного рода данные. Данные в узлах однородны в пределах списка. Т.е. в одном списке одни данные, в другом - другие. Различных данных в одном списке пока что нет, но не уверен, что такой ситуации не возникнет. Манипуляции со списками во всех случаях одинаковы. Поэтому я сделал один класс для управления списком, а данные в узле - это указатель на неопределенный тип: void* Data; Работать оно то работает, только постоянно приходится приводить void* Data; к нужным типам через static cast. Читал, что такие действия не очень приветствуются. Вопрос: насколько правильно мое решение. возможно ли решить данную задачу как-то красивее? Это сообщение отредактировал(а) Merlin_ua - 26.4.2012, 10:15 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Merlin_ua, да. эта задача решается красиво через шаблоны (template). Почитай о них.
|
|||
|
||||
| Merlin_ua |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 22.11.2006 Репутация: нет Всего: нет |
Можно через шаблоны. Но с таким же успехом я бы мог сделать для каждого типа свой узел, меняться будет лишь тип данных, т.е. тип Data. Тогда для каждого такого узла нужен свой класс списка, в котором будет меняться лишь тип узла. Т.е. Мы получим кучу повторяющегося кода, который будет отличаться кое-где двумя строками. Шаблоны сделают тоже самое. только выглядеть это будет посимпатичнее. А если данные в одном списке различны?
|
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Merlin_ua, преждевременная оптимизация - враг хорошего кода.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
смотрите концепцию (boost:: ) any.. где то на форуме были приведены пару разборов ее реализации.. поиск по any и type erasure должен помочь.. Это сообщение отредактировал(а) mes - 27.4.2012, 17:43 |
|||
|
||||
| Merlin_ua |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 22.11.2006 Репутация: нет Всего: нет |
А можно без сторонних библиотек? Меня больше интересуют принципы и усройства механизмов чем готовые решения. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
Merlin_ua, тебе сказали "смотри концепцию" или "используй"?
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |