![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
сразу предупрежу, что тема создана не только на этом форуме, но уж очень желательно сегодня мне с ней разобраться...
тема - перефразированная задача, что щас на работе мне выпала что-то мой моск в пятницу отказывается ее решить может, кто-то поможет... дана такая вот иерархия структур и вектор, заполненный ими:
нужно написать функцию, которая сможет вывести этот вектор. Естественно, вектор может быть заполнен в какой угодно последовательности... + условие - структуры трогать нельзя - ни добавлять ни менять, ни удалять. Они - в ридонли коде. Добавлено Сегодня, 17:33 кстати, для решения разрешены любые боле-мене стандартные уловки - и динамиккаст и т.п. Это сообщение отредактировал(а) Alek86 - 21.3.2008, 17:54 |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Ну, нормальное решение, имхо, в Intefrace virtual print(std::stringstream&). Делать разные структуры, а потом их выводить "единообразно" без общих методов - имхо, нагло. Если же кровь из носа и трогать нельзя совсем - проходимся по вектору, делаем столько dynamic_cast'ов, сколько структур у нас имеется, проверяя от предка к родителям, и выводя члены определённой структуры. Добавлено через 31 секунду З.Ы. Alek86, про кнопку "Код" ты зря забыл |
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
||||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
вроде как решения по условию задачи не существует.
вопрос решен |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
А помоему имеет. Схожая задача описана в "современное проектирование на С++" А. Александресску (мультиметоды).
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
можно тогда примерный вид функции PrintVector?
Это сообщение отредактировал(а) Alek86 - 21.3.2008, 19:19 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
блин. там очень сложно. создается список возможных типов StructN, затем список возможных параметров этих StructN (int, char, double...), затем генерируется список возможных комбинаций и из этого списка генерируется набор функций вывода...
Код я так запросто тут не напишу. Это довольно объемный текст получится. Проще скачать и посмотреть. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Омф. А они-то тут причём? тут загвоздка в том, что в иерархию классов нельзя добавить нужную виртуальную функцию. Мультиметоды - это же расширение виртуальных функций на зависимость от типа двух и более объектов? |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Если честно, я читал эту тему "по диагонали". Уж очень она какой-то абстрактной мне показалась. Поэтому могу чего-то перепутать. Просто в той книжке рассматривался ряд случаем, компоновка которых может дать решение этой задачи. Но, имхо, проще добавить виртуальный метод в интерфейс... |
|||
|
||||
| blinded |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 16.2.2008 Репутация: нет Всего: нет |
Структуры трогать нельзя, а вектор трогать можно? Это обязательно должен быть вектор Interface*?
|
|||
|
||||
| Alek86 |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1299 Регистрация: 30.1.2007 Где: Киев Репутация: 21 Всего: 25 |
blinded, условие задачи - вообще написать функцию
то есть ничего трогать нельзя |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
хак методом:
правда все равно надо добавлять в Interface хотя бы виртуальный деструктор. Его правда полюбому надо добавлять, т.к. такой вектор не то что вывести, его и удалить нормально нельзя. |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
korian, удалить можно... А вот dynamic_cast (как, впрочем, и typeid) вряд ли работать будет без vtable...
Думаю, задача действительно не имеет решения. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
у меня при исполнении этой строчки кода str == "9Interface" |
|||
|
||||
| korian |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 8.3.2008 Где: Украина, Харьков Репутация: 3 Всего: 17 |
удалить то можно, я в то смысле, что деструкторы вызываться не будут для Struct-ов.
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |