Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> аналог NULL для итератора 
:(
    Опции темы
Earnest
Дата 21.9.2007, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Введи вместо итератора boost::optional <iterator> - либо есть, либо нет.
Если буст не используешь - нарисуй что-то похожее: грубо говоря, pair<iterator,bool> + простейшие методы: get, set, reset и isnull. Вместо get можно написать оператор разыменования или оператор(), или даже оператор приведения, вместо set - оператор =. Это чтобы меньше кода править. Самое главное - если просто изменишь тип переменной m_IterSelected на этот optional, компилятор поможет выловить все вхождения и поправить. Если справишься за полчаса, значит, обошелся малой кровью. Если больше - все равно время конечно, но зато запомнишь и больше так не будешь! smile 
Вообще, хранить в классе итераторы - дурная привычка. Итератор, по определению, штука временная.



--------------------
...
PM   Вверх
UnrealMan
Дата 21.9.2007, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Earnest @  21.9.2007,  21:23 Найти цитируемый пост)
Вместо get можно написать оператор разыменования или оператор(), или даже оператор приведения

Ну, оператор разыменования написать можно и даже нужно. И стрелку в добавок к нему. А функциональный оператор тут совсем не к месту. Оператор преобразования можно сделать разве что для получения какого-нибудь псевдо-bool объекта (например, указателя на член класса).
PM MAIL   Вверх
Earnest
Дата 21.9.2007, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Нет, я имела в виду прежде всего цель "малой кровью": оператор приведения (к типу итератора, разумеется) и оператор = позволят сохранить старый код (т.е. он будет компилироваться и работать). Если добавить еще оператор == (int) или (void*) или (лучше) сделать конструктор, который будет принимать 0 (т.е. int\void*) в качестве параметра, да еще + к этому операторы ==\!=, это позволит сохранить в рабочем виде практически весь код. Главное - не перестараться, и со временем все-таки переписать это дело...


--------------------
...
PM   Вверх
UnrealMan
Дата 21.9.2007, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(Earnest @  21.9.2007,  22:17 Найти цитируемый пост)
оператор приведения (к типу итератора, разумеется)

В первую очередь, нужен конструктор, принимающий итератор. Если делать ещё и оператор преобразования к итератору, то перегрузка == и != просто необходима. Но проблема не в этом, а в том, что увеличивается вероятность пропустить какую-нибудь переменную-итератор, которую следует заменить на обёртку. IMHO, получение итератора лучше сделать явным.

Цитата(Earnest @  21.9.2007,  22:17 Найти цитируемый пост)
или (лучше) сделать конструктор, который будет принимать 0 (т.е. int\void*) в качестве параметра

Я бы выбрал не int и не void*, а указатель на член какого-нибудь внутреннего класса.
PM MAIL   Вверх
comcon1
Дата 22.9.2007, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



А почему бы, действительно, не сделать, как сказали выше?? Завести константный list3 пустой. и писать 
Код

if (iter != list3.end()) {
 ;
}

ведь итератор end определен и для пустого списка, или нет??


--------------------
PM MAIL   Вверх
UnrealMan
Дата 22.9.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(comcon1 @  22.9.2007,  12:49 Найти цитируемый пост)
ведь итератор end определен и для пустого списка, или нет?? 

Ну, определён, и что дальше?
PM MAIL   Вверх
comcon1
Дата 22.9.2007, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 11.6.2005
Где: Москва ДАС-МГУ

Репутация: 12
Всего: 17



ну иметь типа нулевой элемент, когда итератор ни на что не указывает, то направлять его на конец нулевого списка, потом проверять это. Это не подходит разве?


--------------------
PM MAIL   Вверх
UnrealMan
Дата 22.9.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Да, не подходит, потому что сранивать можно только итераторы, относящиеся к одному и тому же объекту-контейнеру.

Это сообщение отредактировал(а) UnrealMan - 22.9.2007, 13:30
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.