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

   


Назад  |  Вперёд

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

           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.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.