C++ как работает While (cin> x)?
мой вопрос в том, как делает,
while(cin>>x)
{
//code
}
работа. Или, если быть более конкретным, как насчет того, что код останавливает цикл?
из документации здесь, похоже, что оператор >> возвращает &istream
. Означает ли это, что если чтение завершается неудачно или попадает в конец файла, он не только устанавливает eofbit, failbit или badbit, но и возвращает null? Это не имеет смысла, поэтому я сомневаюсь, что это так.
есть ли какая-то неявная проверка eofbit?
Я спрашиваю, потому что я надеюсь реализовать что-то подобное с 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
как объект. Я просто хотите скопировать один действительно хороший кусок.
Edit: я использую Visual Studio 2010 (что становится настоящей болью), и мне понадобится что-то совместимое с его реализацией C++03 + some c++11.
2 ответов
теперь не могли бы вы написать пример того, как я могу это сделать с вышеуказанными вещами?
такой:
// 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
}
}
из документации здесь похоже, что оператор >> возвращает & istream. Означает ли это, что если чтение завершается неудачно или попадает в конец файла, он не только устанавливает eofbit, failbit или badbit, но и возвращает null?
нет, возвращается ссылка на объект stream, но будут установлены внутренние флаги. Последующие вызовы operator>>
потерпит неудачу после тестирования этих флагов.
есть ли какая-то неявная проверка eofbit?
не уверен, в чем вопрос. Поток не будет пытаться узнать заранее, будет ли следующий запрос завершаться ошибкой, а только установить флаг, если одна операция завершилась неудачно, потому что она попала в EOF. Каждый вызов operator>>
сначала проверить состояние потока, и если поток находится в хорошем состоянии.
как
while(cin>>x)
работы?
существует неявное преобразование из объекта stream в логическое значение. Доходность преобразования true
если поток находится в хорошем состоянии или false
иначе.