Форум программистов, компьютерный форум CyberForum.ru

istream_iterator - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
Pavel.fromBy
 Аватар для Pavel.fromBy
13 / 13 / 1
Регистрация: 31.12.2011
Сообщений: 83
01.04.2012, 17:42     istream_iterator #1
Добрый день, уважаемые форумчане! Прошу ответить на следующий вопрос - почему, когда создается istream_iterator пустым конструктором (например, в алгоритме copy для указания конца потока/файла), то вызывается конструктор объекта того класса, который мы передаем в качестве шаблонного аргумента?? Т.е., почему он вообще вызывается?

Пример:

C++
1
2
3
4
5
6
7
8
9
....
class Test
{
public:
    Test() { cout << "!!!" << endl; }
};
....
istream_iterator<Test>();
...
Заранее благодарен!
P.s. в библиотеке iterator смотрел. Может невнимательно, но ничего "очевидного" не нашел.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.04.2012, 17:42     istream_iterator
Посмотрите здесь:

istream_iterator C++
istream_iterator C++
Разница межу istream_iterator и istreambuf_iterator C++
C++ Как исправить код с istream_iterator?
Отличие istreambuf_iterator от istream_iterator C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 17:51     istream_iterator #2
потому что описан этот итератор как-то так
C++
1
2
3
4
5
6
template <class T, .... еще параметры...>
class istream_iterator : public iterator<...>
{
  T value;
  ....
}
можешь у себя в заголовках глянуть для более подробного.
Pavel.fromBy
 Аватар для Pavel.fromBy
13 / 13 / 1
Регистрация: 31.12.2011
Сообщений: 83
01.04.2012, 18:06  [ТС]     istream_iterator #3
villu, спасибо.. Невнимательность, как я уже и писал
Попутно вопрос в тему - как этот самый istream_iterator, созданный пустым конструктором, указывает на конец файла/потока (причем я ему даже не даю знать, с чем я работаю (файл/поток)). Ну, на примере того же copy:

C++
1
2
3
4
5
....
ifstream f_In("---.txt");
...
copy(istream_iterator<int>(f_In), istream_iterator<int>(), ostream_iterator<int>(cout, " "));
...
villu
202 / 202 / 4
Регистрация: 06.08.2011
Сообщений: 600
Записей в блоге: 1
01.04.2012, 18:16     istream_iterator #4
ну на самом деле он содержит в себе еще и указатель на basic_istream, который, при создании по-умолчанию устанавливается в NULL.
Далее, что происходит, когда создается итератор с указанием потока:

При считывании с потока идет проверка преобразования данных в значение
C++
1
stream_ >> value; // stream_ - указатель, член класса, который указывает на то, что передано в конструкторе, например  istream_iterator<int>(cin, ...)
и если это не возможно
C++
1
2
if(!(*stream_ >> value))
    stream_ = NULL;
.. сбрасывается указатель. Естественно есть сначала проверка на то, что он не NULL
И того имеем:
C++
1
2
3
4
istream_iterator<...>& operator++() {
    if ( stream_ && !(*stream_ >> value)) stream_=NULL;
    return *this;
}
вот как-то так, если память не изменяет.
Pavel.fromBy
 Аватар для Pavel.fromBy
13 / 13 / 1
Регистрация: 31.12.2011
Сообщений: 83
01.04.2012, 18:27  [ТС]     istream_iterator #5
villu, еще раз благодарю! Вопрос закрыт
Yandex
Объявления
01.04.2012, 18:27     istream_iterator
Ответ Создать тему
Опции темы

Текущее время: 21:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru