Листинг 13.7. Файл main.cpp
#include <iostream> using namespace std;
#include "TStack.h" // подключаем файл-заголовок
int main() { TStack t;
t.push(new double(l)); // помещаем в стек числа
t.push(new double(2)); t.push(new double(3));
while (!t.emptyO) // пока стек не пустой
{ cout << *(double *)t.top() << endl; // выводим число с вершины
double *р = (double *)t.pop(); // удаляем элемент из стека
delete р; // возвращаем память
}
return 0;
}
Обратите внимание, что файл реализации явным образом в тексте программы-клиента никак не упоминается. Таким образом, мы ослабили зависимость между файлами и повысили степень инкапсуляции. Файл реализации компилируется, и объектный модуль подключается компоновщиком в исполняемую программу. Еще одна составляющая интегрированной среды — мейкер (maker) — следит за изменениями исходных модулей. До тех пор пока мы не внесем изменения в реализацию стека, в проекте будет использоваться оттранслированный объектный модуль.
Разделение модуля TStack.cpp на интерфейс и реализацию никак не мешает нам наследовать от класса TStack. Вспомним реализацию стека без указателей Stackdouble (см. листинг 8.11) и создадим файл Stackdouble.cpp (листинг 13.8).
Листинг 13.8. Файл Stackdouble.срр — наследование от класса TStack
#include "TStack.h" // подключение определения
class Stackdouble: public TStack { public:
void push(const double& d)
{ double *p = new double(d): TStack::push(p); } double top() const
{ double *p = (double *)TStack::top(); double t = *p; return t:
}
double pop()
{ double *p = (double *)TStack::pop(); double t = *p: delete p: return t:
}
};
Для наследования достаточно подключить файл интерфейса, чтобы было видимо имя и определение класса TStack. Обратите внимание, что в данном случае стража мы не определяем, поскольку класс Stackdouble будет подключаться только к одной единице трансляции — модулю main.срр. Поэтому повторов определения не будет. Однако в общем случае стража нужно задавать всегда — чтобы в дальнейшем при повторном использовании не возникало неожиданностей. Программа-клиент, применяющая стек Stackdouble, представлена в листинге 13.9. |