530____________________Часть III. Современное программирование на C++
1 Решение выглядит достаточно просто, когда вы его уже знаете, но самостоятельно до такого додуматься нелегко. К сожалению, так придется поступать каждый раз.
1 |
// STACK.H — Определение шаблона стека на основе вектора |
2 |
#ifndefSTACKH |
3 |
ftdefineSTACKH |
4 |
#include <stdio.h> |
5 |
ftinclude "vector.h" |
6 |
template <class T, unsigned long SIZE = 100> |
7 |
class STACK : public VECTOR<T, SIZE> |
8 |
{ |
9 |
public: |
10 |
STACK () : top(0){}; |
11 |
void Push( T elem) . |
12 |
( iff top < SIZE) |
13 |
operator[]( top++) = elem; |
14 |
else |
15 |
perror( "Переполнение стека"); |
16 |
} |
17 |
T Pop() |
18 |
( ' , |
19 |
iff top > 0 ) |
20 |
return operator!]( —top); |
21 |
perror("Исчерпание стека"); |
22 |
return operator[]( SIZE); |
23 |
} |
24 |
private: |
25 |
unsigned long top; |
26 |
STACK(const STACKS) ; |
27 |
STACKS operator"(const STACKS); |
28 |
); |
29 |
#endif |
В приведенном заголовке stack.h класс STACK наследуется от класса VECTOR. В строке 7 вы видите синтаксис открытого наследования (это тема главы 20). Для манипуляций со стеком предназначены функции push и pop, совсем как одноименные ассемблерные команды. Эти функции-члены определены как встраиваемые. Строки 13 и 20 показывают, как для обращения к данным могут использоваться функции-члены базового класса (в да'нном случае — как функции доступа). |
|
Строки 26 и 27 демонстрируют применение техники блокирования копирования объектов. Объявив операцию присваивания и конструктор копий как закрытые функции и отказываясь от их определения, мы запрещаем копи- |