Язык программирования C++ для профессионалов



       Силлиманит еще на сайте. |   

Ввод пользовательских типов


Операцию ввода для пользовательского типа можно определить в точности так же, как и операцию вывода, но для операции ввода существенно, чтобы второй параметр имел тип ссылки, например:

istream& operator>>(istream& s, complex& a) /* формат input рассчитан на complex; "f" обозначает float: f ( f ) ( f , f ) */ { double re = 0, im = 0; char c = 0;

s >> c; if (c == '(') { s >> re >> c; if (c == ',') s >> im >> c; if (c != ')') s.clear(ios::badbit); // установим состояние } else { s.putback(c); s >> re; }

if (s) a = complex(re,im); return s; }

Несмотря на сжатость кода, обрабатывающего ошибки, на самом деле учитывается большая часть ошибок. Инициализация локальной переменной с нужна для того, чтобы в нее не попало случайное значение, например '(', в случае неудачной операции. Последняя проверка состояния потока гарантирует, что параметр a получит значение только при успешном вводе.

Операция, устанавливающая состояние потока, названа clear() (здесь clear - ясный, правильный), поскольку чаще всего она используется для восстановления состояния потока как good(); значением по умолчанию для параметра ios::clear() является ios::goodbit.




Содержание  Назад  Вперед