Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Abstrakter Iterator из области С++

636  1 2 3 все
Программист знакомое лицо09.07.12 10:45
NEW 09.07.12 10:45 
в ответ Murr 08.07.12 17:19
В ответ на:
Чего Я не вижу - где инстанцируется то, что должно быть возвращено...

Ты уж прости меня, но писать всю эту требуху я не буду :) Ибо не смысла :D
В ответ на:
Ну и, должно быть очевидно, что писать руками имплементацию итератора каждый раз нет никакого желания...

кэп! :)
#41 
Программист знакомое лицо09.07.12 10:58
09.07.12 10:58 
в ответ ThorV 08.07.12 21:23
В ответ на:
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив

Задача (прикладная) пройтись по элементам конкретного контейнера, о котором известно ВСЕ уже на стадии написания кода.
А "пройтись по ЛЮБОМУ" контейнеру - это АБСТРАКЦИЯ, и разрешается, например, шаблонами. А можно эту абвстракцию разрешить и другим способом - например унаследовав все типы данных от CObject. Итератор будет, а шаблонов нет.
В ответ на:
А если у класса нет виртуальных функций, то компилятор шлет такому dynamic_cast большой пианэрский привет

Ну так можно ж сделать виртуальную функцию... в чем проблема?
В ответ на:
Извини конечно, но какого ...уя использовать малопривлекательное решение от Явы?

Ты что пытаешься мне доказать? Что стл рулит? :) Я это и так знаю и использую стл когда мне это нужно :) И своих итераторов не пишу :)
Но ведь это не означает, что нельзя написать итератор БЕЗ шаблона? Или как?
#42 
  abubakr прохожий09.07.12 11:32
NEW 09.07.12 11:32 
в ответ Программист 09.07.12 10:58
В ответ на:
А "пройтись по ЛЮБОМУ" контейнеру - это АБСТРАКЦИЯ, и разрешается, например, шаблонами. А можно эту абвстракцию разрешить и другим способом - например унаследовав все типы данных от CObject. Итератор будет, а шаблонов нет.

А как поступим с примитивными типами данных?
В ответ на:
Но ведь это не означает, что нельзя написать итератор БЕЗ шаблона? Или как?

Конечно можно. Но только в качестве примера, типа так делать ни в коем случае нинада :-)
#43 
Программист знакомое лицо09.07.12 12:09
NEW 09.07.12 12:09 
в ответ abubakr 09.07.12 11:32
В ответ на:
А как поступим с примитивными типами данных?

Уверен, что для примитивов тожно можено накалякать итератор :)
В ответ на:
Конечно можно.

Ну вот и славненько :)
Следовательно высказывание
В ответ на:
Вообще то итераторы предполагают использование template

опровергнуто.
ЧТД.
В ответ на:
Но только в качестве примера, типа так делать ни в коем случае нинада :-)

Это уже другая тема :D
#44 
anly коренной житель09.07.12 12:31
anly
NEW 09.07.12 12:31 
в ответ abubakr 09.07.12 07:55
нет, я имел ввиду +=
речь шла об универсальном итераторе для всех конрейнеров с любой структурой данных.
советую почитать тему.
Проклят нарушающий межи ближнего своего (Втор.27:17)
#45 
  abubakr прохожий09.07.12 12:39
NEW 09.07.12 12:39 
в ответ anly 09.07.12 12:31
насчет оператора я погорячился :-)
#46 
ThorV прохожий09.07.12 18:02
ThorV
NEW 09.07.12 18:02 
в ответ Программист 09.07.12 10:58, Последний раз изменено 09.07.12 18:18 (ThorV)
>>Задача (прикладная) пройтись по элементам конкретного контейнера, о котором известно ВСЕ уже на стадии написания кода.
Да ну? А как же быть с std::copy и практически всем <algorithm>?
>>Ну так можно ж сделать виртуальную функцию... в чем проблема?
Ни в чем, но зачем ? Ради dynamic_cast'а? Кстати, если ты уж озабочен производительностью, то dynamic_cast вещь довольно тяжеловесная, я уж не говорю, что :(
>>А можно эту абвстракцию разрешить и другим способом - например унаследовав все типы данных от CObject.
Привет из жабы... Осталось только как в жабе написать классы-оболочки вокруг встроенных типов( по другому и не получится )...
Самое главное, то что вы вдвоем впариваете, в лучшем случае может ( через анус и тухес ) работать со списками и деревьями, но пока что я не услышал ответа на вопрос: как итератор, не заточенный под конкретный тип дереференцируемого объекта, можно без шаблонов реализовать для векторов и массивов?
Короче, резюме:
Ты мне хочешь доказать, что умеешь ковырять в носу пяткой? Можно и так, согласен, но не надо пропагандировать это как здоровый образ жизни.
#47 
rahimov80 постоялец31.07.12 16:36
NEW 31.07.12 16:36 
в ответ ThorV 08.07.12 21:23, Последний раз изменено 31.07.12 16:38 (rahimov80)
В ответ на:
>>Задача итетатора - пройти по элементам списка.
Задача итератора - пройтись по ЛЮБОМУ контейнеру, включая вектор и массив

Это где вы такое определение видели? Вики говорит: "an iterator is an object that enables a programmer to traverse a container. "
В ответ на:
>>Ну тогда уж dinamic_cast, чтобы проверить на NULL :D
А если у класса нет виртуальных функций, то компилятор шлет такому dynamic_cast большой пианэрский привет
>>В любом случае, если не хочешь иметь дело с void *, то используй структуру классов. В чем проблема?
Извини конечно, но какого ...уя использовать малопривлекательное решение от Явы? Как быть со встроенными типами? Писать оболочки вокруг int/char/float?

Хотите задачу "из жизни". Есть контейнер, реализованный то ли как вектор, то ли лист. Он содержит пойнтеры на абстрактный CChannel, из который наследуется DVB-S Channel, DVB-T Channel, DVB-C Channel, etc (спутник, наземный сигнал, кабель, и т.д.)
По этому листу надо пройтись огромной кучей способов: последовательно от одного к другому, последовательно но пропустить не совпадающие каналы (для DVB-S должны совпадать bandwidth и поляризация - не суть важно), перепрыгнуть на величину графической страницы, перепрыгнуть но только на совпадающий канал, и т.д.
В этой задаче то, что предложил ТС и то что поддерживает "Программист" это то, что и нужно и ты не обойдешся здесь решениями из STL, и ни кто здесь не говорит об универсальном итераторе для встроенных типов, то есть "каждому овощу - свою корзину!"
#48 
Simple Nothing is f*cked31.07.12 16:49
Simple
NEW 31.07.12 16:49 
в ответ rahimov80 31.07.12 16:36
Первое впечатление: кривость дизайна. Если у CChannel есть интерфейс (а он должен быть), значит, информация о конкретных типах неважна. Следовательно, вполне достаточно стандартных итераторов.
#49 
rahimov80 постоялец31.07.12 17:17
NEW 31.07.12 17:17 
в ответ Simple 31.07.12 16:49
А никто и не говорит об конкретных типах: CChannel имеет какои нибудь bool IsCompatibly( CChannel& ) =0. Только второй итератор должен пропускать, те элементы которые ответят false, а первый итератор об этом и не спрашивает. А четверый ещё и должен подсчитывать, а сколько элементов он не пропустил.
#50 
Simple Nothing is f*cked31.07.12 22:44
Simple
NEW 31.07.12 22:44 
в ответ rahimov80 31.07.12 17:17
Это все можно сделать алгоритмами.
Впрочем, почему бы и нет?
#51 
1 2 3 все