Язык программирования C++. Вводный курс




Объявления друзей в шаблонах Queue и QueueItem - часть 2


// как задать аргумент типа Queue?

ostream& operator<<( ostream &, ??? );

Поскольку Queue – это шаблон класса, то в имени конкретизированного экземпляра должен быть задан полный список аргументов:

ostream& operator<<( ostream &, const Queue<int> & );

Так мы определили оператор вывода для класса, конкретизированного из шаблона Queue

типом int. Но что, если Queue – это очередь элементов типа string?

ostream& operator<<( ostream &, const Queue<string> & );

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

ostream& operator<<( ostream &, const Queue<Type> & );

Однако из этого перегруженного оператора вывода придется сделать шаблон функции:

template <class Type> ostream&

   operator<<( ostream &, const Queue<Type> & );

Теперь всякий раз, когда оператору ostream

передается конкретизированный экземпляр Queue, конкретизируется и вызывается шаблон функции. Вот одна из возможных реализаций оператора вывода в виде такого шаблона:

template <class Type>

ostream& operator<<( ostream &os, const Queue<Type> &q )

{

   os << "< ";

   QueueItem<Type> *p;

   for ( p = q.front; p; p = p->next )

      os << *p << " ";

   os << " >";

   return os;

}

Если очередь объектов типа int

содержит значения 3, 5, 8, 13, то распечатка ее содержимого с помощью такого оператора дает

< 3 5 8 13 >

Обратите внимание, что оператор вывода обращается к закрытому члену front

класса Queue. Поэтому оператор необходимо объявить другом Queue:

template <class Type>

class Queue {

   friend ostream&

      operator<<( ostream &, const Queue<Type> & );

   // ...

};

Здесь, как и при объявлении друга в шаблоне класса Queue, создается взаимно однозначное соответствие между конкретизациями Queue и оператора operator<<().




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