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

template

void queue::qput(QType i)

{

 if(sloc==SIZE) {

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

  return;

 }

 sloc++;

 q[sloc] = i;

}

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

template

QType queue::qget()

{

 if(rloc == sloc) {

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

  return 0;

 }

 rloc++;

 return q[rloc];

}

int main()

{

 queue 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 с, 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 а, b;

queue с, d;

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

queue chrptrQ;

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

struct addr {

 char name[40];

 char street[40];

 char city[30];

 char state[3];

 char zip[12];

};

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

queue obj;

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

Пример класса с двумя обобщенными типами данных

Шаблонный класс может иметь несколько обобщенных типов данных. Для этого достаточно объявить все нужные типы данных в template-спецификации в виде элементов списка, разделяемых запятыми. Например, в следующей программе создается класс, который использует два обобщенных типа данных.

/* Здесь используется два обобщенных типа данных в определении класса.

*/

#include

using namespace std;

template

class myclass {

  Type1 i;

  Type2 j;

 public:

  myclass(Type1 a, Type2 b) { i = a; j = b; }

  void show() { cout << i << ' ' << j << '\n'; }

};

int main()

{

 myclass ob1(10, 0.23);

 myclass ob2('x', "Это тест.");

 ob1.show(); // отображение int- и double-значений

 ob2.show(); // отображение значений типа char и char *

 return 0;

}

Эта программа генерирует такие результаты.

10 0.23

X Это тест.

Перейти на страницу:

Все книги серии Изучайте C++ с профессионалами

Похожие книги