Мой вопрос: как,
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.
Теперь не могли бы вы написать пример того, как я могу сделать это с помощью вышеупомянутых вещей?
Как это:
// 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, но также возвращает ноль?
Нет, ссылка на объект потока возвращается, но внутренние флаги будут установлены. Последующие звонки operator>>
потерпит неудачу после проверки этих флагов.
Есть ли какая-то неявная проверка эофбита?
Не уверен, что вопрос. Поток не будет пытаться определить заранее, будет ли следующий запрос завершен неудачей, а только установит флаг, если одна операция не удалась, потому что он достиг EOF. Каждый звонок operator>>
сначала проверит состояние потока и продолжит работу, только если поток находится в хорошем состоянии.
Как
while(cin>>x)
Работа?
Существует неявное преобразование объекта потока в логическое значение. Конверсия дает true
если поток в хорошем состоянии или false
иначе.