Шаг 507.
Библиотека STL. Ввод-вывод с использованием потоковых классов. Ввод-вывод с использованием вспомогательных функций

    На этом шаге мы рассмотрим особенности ввода-вывода с использованием вспомогательных функций.

    Если реализация оператора ввода-вывода требует доступа к закрытым данным объекта, то стандартные операторы должны поручить фактическую работу вспомогательным функциям классов. При помощи такого подхода можно также реализовать полиморфные чтение и запись. Примерная реализация выглядит так:

class Fraction {
    ...
    public:
      virtual void printOn (std::ostream& strm) const;  // Вывод
      virtual void scanFrom (std::istream& strm);       // Ввод
      ...
};

std::ostream& operator << (std::ostream& strm, const Fraction& f)
{
    f.printOn(strm);
    return strm;
}

std::istream& operator >> (std::istream& strm, Fraction& f)
{
    f.scanFrom (strm);
    return strm;
}

    Типичный пример - непосредственный доступ к числителю и знаменателю дроби при вводе:

void Fraction::scanFrom (std::istream& strm)
{
  .   .   .   .
  // Прямое присваивание значений компонентов 
  num = n; 
  denom = d; 
}

    Существует и другое решение: если класс не будет использоваться в качестве базового, операторы ввода-вывода можно объявить дружественными (friend) для данного класса. Однако этот подход существенно ограничивает свободу действий при наследовании. Дружественные функции не могут быть виртуальными, что является потенциальной причиной ошибочных вызовов. Например, если в аргументе оператора ввода передается ссылка на базовый класс, которая на самом деле ссылается на объект производного класса, то для нее будет вызван оператор базового класса. Для решения проблемы производные классы не должны реализовывать собственные операторы ввода-вывода. Таким образом, представленная реализация более универсальна, чем дружественные функции. Именно она может рассматриваться как стандартное решение, хотя в большинстве примеров применяются дружественные функции.

    На следующем шаге мы рассмотрим пользовательские операторы с функциями неформатированного ввода-вывода.




Предыдущий шаг Содержание Следующий шаг