| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > [?] Организация циклического списка |
| Автор: XuTMAH 3.10.2005, 21:05 | ||
Есть следующая идея:
Но есть некоторые проблемы, а именно: 1) Нужно чтобы, например, в операции ++ осуществлялось следующее: когда итератор становиться законечным (т.е. возвращамым функцией list< T >::end() ) нужно чтобы он сразу становился первым (т.е. например сделать ещё один ++ и он станет первым), тогда возникает вопрос - как узнать из самого итератора, что он законечный? возможен вариан воспользоваться try-catch но опять же вопрос - какая операция для законечного итератора может сгенерировать исключение? Может какие-нибудь ещё способы есть узнать, что итератор законечный? 2) Нужно сохранять итератор псевдо начала этого циклического списка, т.к. "начало" у него будет потихоньку перемещаться и не один раз пройдёт через обычное начало, но представленый мной вариан не работает, даже не знаю почему. P.S. Очень не хочется заморачиваться с new/delete и надеюсь STL спасёт меня... Заранее благодарю за помощь. |
| Автор: Earnest 3.10.2005, 21:37 | ||
Никак не узнать. Реализации list::iterator могут быть разными, но чаще всего он просто хранит указатель на узел списка. Исключения при обращении к невалидному итератору могут возникнуть, а могут и нет (смотря куда нарвешься). И вообще, это не способ: генерировать исключение, чтобы что-нибудь узнать - крайне неправильно: это очень накладно! Cпособ один: хранить в твоем циклическом итераторе начальный и конечный итераторы исходного списка. Ты бы сформулировал задачу поточнее, а то возникает вопрос: через конец-то ты пройдешь, а заканчивать итерирование ты как будешь? Если list::end() никогда не будет возвращаться? |
| Автор: XuTMAH 4.10.2005, 14:55 | ||||
Заканчивать буду по равенству с псевдо началом => нужно будет оператор == перегрузить. Немного доработав и дополнив код:
Возникла более конкретная проблема, а именно: почему не правильно работает вариант написанный в main() (закоментированый - рабочий), т.е. при вызове конструктора "C" некорректно конструируется класс "B" (это можно проверить по непонятному значению поля B.begin_iterator) ??? |
| Автор: Guest 5.10.2005, 02:32 | ||||
Ошибка в конструкторе:
Лично у меня компилятор выдал предупреждение: warning C4355: 'this' : used in base member initializer list В MSDN'е на этот счет написано:
Если в кратце, то нельзя использовать this в конструкторах. |
| Автор: XuTMAH 5.10.2005, 12:00 | ||||||||
| Наверное не зря компилятор ругается... Но почему же тогда если заменить следующий кусок кода в main()
на
то всё работает без единой ошибочки, хотя
этот конструктор всё равно вызывается ... Как инересно правильно написать? Если так
то результат ни в одном ни в другом случае не изменяется... |