![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
XuTMAH |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Есть следующая идея:
Но есть некоторые проблемы, а именно: 1) Нужно чтобы, например, в операции ++ осуществлялось следующее: когда итератор становиться законечным (т.е. возвращамым функцией list< T >::end() ) нужно чтобы он сразу становился первым (т.е. например сделать ещё один ++ и он станет первым), тогда возникает вопрос - как узнать из самого итератора, что он законечный? возможен вариан воспользоваться try-catch но опять же вопрос - какая операция для законечного итератора может сгенерировать исключение? Может какие-нибудь ещё способы есть узнать, что итератор законечный? 2) Нужно сохранять итератор псевдо начала этого циклического списка, т.к. "начало" у него будет потихоньку перемещаться и не один раз пройдёт через обычное начало, но представленый мной вариан не работает, даже не знаю почему. P.S. Очень не хочется заморачиваться с new/delete и надеюсь STL спасёт меня... Заранее благодарю за помощь. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Никак не узнать. Реализации list::iterator могут быть разными, но чаще всего он просто хранит указатель на узел списка. Исключения при обращении к невалидному итератору могут возникнуть, а могут и нет (смотря куда нарвешься). И вообще, это не способ: генерировать исключение, чтобы что-нибудь узнать - крайне неправильно: это очень накладно! Cпособ один: хранить в твоем циклическом итераторе начальный и конечный итераторы исходного списка. Ты бы сформулировал задачу поточнее, а то возникает вопрос: через конец-то ты пройдешь, а заканчивать итерирование ты как будешь? Если list::end() никогда не будет возвращаться? -------------------- ... |
|||
|
||||
XuTMAH |
|
||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Заканчивать буду по равенству с псевдо началом => нужно будет оператор == перегрузить. Немного доработав и дополнив код:
Возникла более конкретная проблема, а именно: почему не правильно работает вариант написанный в main() (закоментированый - рабочий), т.е. при вызове конструктора "C" некорректно конструируется класс "B" (это можно проверить по непонятному значению поля B.begin_iterator) ??? |
||||
|
|||||
Guest |
|
||||
Unregistered |
Ошибка в конструкторе:
Лично у меня компилятор выдал предупреждение: warning C4355: 'this' : used in base member initializer list В MSDN'е на этот счет написано:
Если в кратце, то нельзя использовать this в конструкторах. |
||||
|
|||||
XuTMAH |
|
||||||||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 3.6.2005 Репутация: нет Всего: нет |
Наверное не зря компилятор ругается...
Но почему же тогда если заменить следующий кусок кода в main()
на
то всё работает без единой ошибочки, хотя
этот конструктор всё равно вызывается ... Как инересно правильно написать? Если так
то результат ни в одном ни в другом случае не изменяется... Это сообщение отредактировал(а) XuTMAH - 5.10.2005, 17:13 |
||||||||
|
|||||||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |