#c #class #stream #operator-overloading
#c #класс #поток #перегрузка оператора
Вопрос:
istreamamp; operator>>(istreamamp; stream, list<monom>amp; pol)
{
char z1,z2;
monom m;
stream >> noskipws;
while(stream >> m.a >> z1 >> z2 >> m.i) {
if (z1!=’x’ || z2!=’^’) {
stream.setstate(ios::failbit);
break;
}
pol.push_back(m);
// This is where I do not understand why stream >> z1
if (stream.peek()==’n’) {
stream >> z1;
break;
}
}
pol.sort();
pol.remove(null);
return stream;
}
У меня есть класс monom
, и я хочу перегрузить >>
оператор для списка, состоящего из monom
. Глядя на код, я понимаю все до точки
if (stream.peek()==’n’) {
stream >> z1;
break;
}
Я понимаю, что это stream.peek()
просматривает следующий пробел, и если он пустой ( == n
), то зачем ему это stream >> z1
, это меня смущает.
Комментарии:
1. Если это не ваш код, почему бы не спросить человека, который его написал?
2. Вы читали об
std::noskipws
? Я думаю, вы узнаете, почемуstream >> z1
это делается там.3. @NathanOliver Если бы у меня была такая роскошь, я бы
4. Я думаю, это так, что когда данные считываются из потока в объект monom, новые строки не помещаются в объект, поскольку вместо этого они считываются в переменную char z1.
Ответ №1:
Код выполняет цикл чтения monom
элементов, отформатированных как <m.a value>x^<m.i value>
, пока не достигнет разрыва строки. Предполагается, что между значениями или элементами нет пробелов, включая разрывы строк.
Цикл используется peek()
для проверки, заканчивается ли каждый успешно прочитанный monom
элемент разрывом строки или нет. Если присутствует разрыв строки, разрыв строки извлекается из потока (чтобы он не оставался в потоке для последующего чтения) и цикл завершается. В противном случае цикл продолжит чтение следующего monom
элемента.
Использование noskipws
так operator>>
, что разрыв строки не будет рассматриваться как пробел, который он может пропустить.
Комментарии:
1. Это имеет смысл, но почему это
stream >> z1
необходимо в цикле, наверняка было бы достаточно просто иметьbreak
там?2. @user9078057 как я уже сказал, разрыв строки извлекается из потока до завершения цикла. Если бы final
>> z1
был опущен, разрыв строки остался бы в потоке для последующего чтения для извлечения. Разрыв строки используется в качестве маркера конца данных, поэтому его следует извлечь вместе с данными, которыми он заканчивается3. Хорошо, я понимаю, но почему именно это должно быть
stream >> z1
, а не, например,stream >> z2
илиstream >> m.a
. Другими словами, почемуz1
необходим выбор, мне это кажется произвольным4. @user9078057 потому что это произвольно.
z1
доступно в этот момент. Код используетz1
иz2
в качестве временных заполнителей, он мог бы использовать любой из них при окончательном чтении разрыва строки. Автор случайно выбралz1
вместоz2
или объявил еще одну переменную только для этого чтения. В данном случае это действительно не имеет значения.