операторы — C ++, как работает While (cin & gt; & gt; x)?

Мой вопрос: как,

while(cin>>x)
{
//code
}

Работа. Или, чтобы быть более конкретным, что с этим кодом останавливает цикл?

Из документации Вот, похоже, что оператор >> возвращает &istream, Означает ли это, что если чтение завершается неудачно или попадает в конец файла, оно не только устанавливает eofbit, failbit или badbit, но также возвращает ноль? Это не имеет смысла, поэтому я сомневаюсь, что это так.

Есть ли какая-то неявная проверка эофбита?

Я спрашиваю, потому что я надеюсь реализовать нечто подобное с 2 классами, как это,

class B
{
//variables and methods
}

class A
{
//Variables and methods
//Container of B objects. ex. B[] or vector<B> or Map<key,B>
&A >> (B b);
}

int main()
{
A a;
B b;

while( a >> b)
{
//Code
}

}

Замечания: Я не ищу наследство от istream если это не то, откуда приходит магия, которая делает эту работу. Причина этого в том, что я надеюсь сохранить классы и их зависимости как можно меньше. Если я унаследую от istream Я получу все свои публичные и защищенные вещи, и я не пытаюсь создать istream как объект. Я просто хочу скопировать один ДЕЙСТВИТЕЛЬНО хороший кусок этого

Редактировать: Я использую Visual Studio 2010 (что становится настоящей болью), и мне нужно что-то совместимое с его реализацией C ++ 03 + немного C ++ 11.

7

Решение

Теперь не могли бы вы написать пример того, как я могу сделать это с помощью вышеупомянутых вещей?

Как это:

// UNTESTED
class B
{
//variables and methods
}

class A
{
bool still_good;

//Variables and methods
//Container of B objects. ex. B[] or vector<B> or Map<key,B>
A& operator>>(B& b) {
try_to_fill_b();
if(fail) still_good = false;
return *this;
}
explicit operator bool() { return still_good; }
}

int main()
{
A a;
B b;

while( a >> b)
{
//Code
}

}
4

Другие решения

Из документации здесь видно, что оператор >> возвращает &IStream. Означает ли это, что если чтение завершается неудачно или попадает в конец файла, оно не только устанавливает eofbit, failbit или badbit, но также возвращает ноль?

Нет, ссылка на объект потока возвращается, но внутренние флаги будут установлены. Последующие звонки operator>> потерпит неудачу после проверки этих флагов.

Есть ли какая-то неявная проверка эофбита?

Не уверен, что вопрос. Поток не будет пытаться определить заранее, будет ли следующий запрос завершен неудачей, а только установит флаг, если одна операция не удалась, потому что он достиг EOF. Каждый звонок operator>> сначала проверит состояние потока и продолжит работу, только если поток находится в хорошем состоянии.

Как while(cin>>x) Работа?

Существует неявное преобразование объекта потока в логическое значение. Конверсия дает true если поток в хорошем состоянии или false иначе.

5

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector