| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > как вывести такой вектор? |
| Автор: Alek86 21.3.2008, 17:37 | ||
| сразу предупрежу, что тема создана не только на этом форуме, но уж очень желательно сегодня мне с ней разобраться... тема - перефразированная задача, что щас на работе мне выпала что-то мой моск в пятницу отказывается ее решить может, кто-то поможет... дана такая вот иерархия структур и вектор, заполненный ими:
нужно написать функцию, которая сможет вывести этот вектор. Естественно, вектор может быть заполнен в какой угодно последовательности... + условие - структуры трогать нельзя - ни добавлять ни менять, ни удалять. Они - в ридонли коде. Добавлено Сегодня, 17:33 кстати, для решения разрешены любые боле-мене стандартные уловки - и динамиккаст и т.п. |
| Автор: Alek86 21.3.2008, 17:55 | ||
исправил
можешь этот кусок в коде? у меня как раз нестыковка с динамик кастами и шаблонами - куда кастить? |
| Автор: Alek86 21.3.2008, 18:34 |
| вроде как решения по условию задачи не существует. вопрос решен |
| Автор: bsa 21.3.2008, 19:10 |
| А помоему имеет. Схожая задача описана в "современное проектирование на С++" А. Александресску (мультиметоды). |
| Автор: Alek86 21.3.2008, 19:18 |
| можно тогда примерный вид функции PrintVector? |
| Автор: bsa 21.3.2008, 19:25 |
| блин. там очень сложно. создается список возможных типов StructN, затем список возможных параметров этих StructN (int, char, double...), затем генерируется список возможных комбинаций и из этого списка генерируется набор функций вывода... Код я так запросто тут не напишу. Это довольно объемный текст получится. Проще http://files.zipsites.ru/books/programming/moderncppdesign_rus.zip и посмотреть. |
| Автор: JackYF 21.3.2008, 20:07 | ||
Омф. А они-то тут причём? тут загвоздка в том, что в иерархию классов нельзя добавить нужную виртуальную функцию. Мультиметоды - это же расширение виртуальных функций на зависимость от типа двух и более объектов? |
| Автор: bsa 22.3.2008, 00:15 | ||
Если честно, я читал эту тему "по диагонали". Уж очень она какой-то абстрактной мне показалась. Поэтому могу чего-то перепутать. Просто в той книжке рассматривался ряд случаем, компоновка которых может дать решение этой задачи. Но, имхо, проще добавить виртуальный метод в интерфейс... |
| Автор: blinded 22.3.2008, 12:36 |
| Структуры трогать нельзя, а вектор трогать можно? Это обязательно должен быть вектор Interface*? |
| Автор: Alek86 22.3.2008, 18:01 |
| blinded, условие задачи - вообще написать функцию то есть ничего трогать нельзя |
| Автор: korian 22.3.2008, 18:30 | ||
хак методом:
правда все равно надо добавлять в Interface хотя бы виртуальный деструктор. Его правда полюбому надо добавлять, т.к. такой вектор не то что вывести, его и удалить нормально нельзя. |
| Автор: bsa 22.3.2008, 19:11 |
| korian, удалить можно... А вот dynamic_cast (как, впрочем, и typeid) вряд ли работать будет без vtable... Думаю, задача действительно не имеет решения. |
| Автор: mes 22.3.2008, 19:14 |
у меня при исполнении этой строчки кода str == "9Interface" |
| Автор: korian 22.3.2008, 19:16 |
| удалить то можно, я в то смысле, что деструкторы вызываться не будут для Struct-ов. |
| Автор: Alek86 22.3.2008, 19:16 | ||||
1. идею понял, правда у меня она не пашет (но идея - хоть кривое, но решение задачи для одного компилятора) 2. не обязательно после
сработает
3. ну почему же так прям "полюбому"... Если интерфейс не рассчитан, чтобы с него удаляли, то деструктор может быть обычным (желательно в привате) |
| Автор: bsa 22.3.2008, 19:19 | ||
typeid(...).name() возвращает внутреннее имя объекта. Оно может быть любым (в т.ч. и ""). А потом, если у базового класса нет хотя бы одного виртуального метода (обычно, деструктор), то typeid и dynamic_cast не работают. |
| Автор: korian 22.3.2008, 19:21 |
| ну это понятно, что это работать будет только там где проверено. у mes вон вообще какое-то "9Interface". |
| Автор: bsa 22.3.2008, 19:21 | ||
Меня что-то переглючило и я решил, что речь идет про удаление потомков. Конечно, в данном случае нет практически никакого смысла в этом Interface |