В следующей программе класс 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, достаточно использовать такое объявление.