Выбрать главу

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

// Демонстрация использования обобщенного класса очереди.

#include <iostream>

using namespace std;

const int SIZE=100;

// Создание обобщенного класса queue.

template <class QType>

class queue{

  QType q[SIZE];

  int sloc, rloc;

 public:

  queue() { sloc = rloc =0; }

  void qput(QType i);

  QType qget();

};

// Занесение объекта в очередь.

template <class QType>

void queue<QType>::qput(QType i)

{

 if(sloc==SIZE) {

  cout << "Очередь заполнена.\n";

  return;

 }

 sloc++;

 q[sloc] = i;

}

// Извлечение объекта из очереди.

template <class QType>

QType queue<QType>::qget()

{

 if(rloc == sloc) {

  cout << "Очередь пуста.\n";

  return 0;

 }

 rloc++;

 return q[rloc];

}

int main()

{

 queue<int> a, b; // Создаем две очереди для целых чисел.

 a.qput(10);

 a.qput(20);

 b.qput(19);

 b.qput(1);

 cout << a.qget() << " ";

 cout << a.qget() << " ";

 cout << b.qget() << " ";

 cout << b.qget() << "\n";

 queue<double> с, d; // Создаем две очереди для double-значений.

 c.qput(10.12);

 c.qput(-20.0);

 d.qput(19.99);

 d.qput(0.986);

 cout << с.qget() << " ";

 cout << с.qget() << " ";

 cout << d.qget()<< " ";

 cout << d.qget() << "\n";

 return 0;

}

При выполнении этой программы получаем следующие результаты.

10 20 19 1

10.12 -20 19.99 0.986

В этой программе объявление обобщенного класса подобно объявлению обобщенной функции. Тип данных, хранимых в очереди, обобщен в объявлении класса. Он неизвестен до тех пор, пока не будет объявлен объект класса queue, который и определит реальный тип данных. После объявления конкретного экземпляра класса queue компилятор автоматически сгенерирует все функции и переменные, необходимые для обработки реальных данных. В данном примере объявляются два различных типа очереди: две очереди для хранения целых чисел и две очереди для значений типа double. Обратите особое внимание на эти объявления:

queue<int> а, b;

queue<double> с, d;

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

queue<char *> chrptrQ;

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

struct addr {

 char name[40];

 char street[40];

 char city[30];

 char state[3];

 char zip[12];

};

Тогда для того, чтобы с помощью класса queue сгенерировать очередь для хранения объектов типа addr, достаточно использовать такое объявление.