530____________________Часть III. Современное программирование на C++

1 Решение выглядит достаточно просто, когда вы его уже знаете, но самостоятельно до такого додуматься нелегко. К сожалению, так придется поступать каждый раз.

h05301.jpg

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