Программирование >>  Расширенная версия языка c++ 

1 ... 106 107 108 [ 109 ] 110 111 112 ... 227


list<char>

list<char> *p, *last; ,

i; , -

создание списка last = sstart;

eor(i=l; i<26; i++) { ....

p = new list<char (a + i] ; p->add(last) ;

:M j..

last = p;

вывод списка p

cout p

} . . return 0; . ,

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

list<char> start (а);

Простой родовой связанный список # include <iostreain>

using namespace std; . .- . . . ...

: -

template <clas a t> class list { . . ,-.

data t data; ,. i;; =r . . .. -

list *next; . . . ; -.rj- . . ,

public:

list (data t d) ;

void add (list *node) { node->next = this; next = 0; }

list *getnext() { return next; }

data t getdataO { return data; } 1 ... i.

template <class data t : : list (data t d)

data = d; next = 0;

int mainO



334 Самоучитель~:.С++

Отметьте, что необходимый тип данных задается между угловыми скобками.

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

щего можно создать другой где можно было бы хранить

целые:

list<int> int start (1) ;

Можно также использовать список list для хранения создаваемых вами типов

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

struct addr {

char name [40] ;

char street[40];

char city[30];

char state [3] ;

char zip[12]; } .

Теперь, чтобы с помощью списка Ust хранить объекты типа addr, используйте такое объявление (предположим, что объект stnictvar содержит правильную структуру addr):

list<addr> obj (structvar);

2. Ниже представлен другой пример родового класса. Это переработанный класс stack, впервые приведенный в главе 1. Однако в данном случае класс stack реализован как шаблон. Следовательно, в нем можно хранить объекты любого типа. В представленном ниже примере создаются стек символов и

стек действительных чисел:

Здесь показав садовой стек

ttinclude <iostreain> . . .

using namespace std;

ttdefine SIZE 10

Создание родового класса stack

template <class 3tackType> class stack {

StacliType stck [SIZE]; содержит стек

in tos; индекс вершины стека т

public:

voi tO { to 0; } инициализация стека void push (StackType ch) ; помещает объект в стек StacliType pop О ; выталкивает объект из стека



, I

1...

Глав 1 1. Шаблоны и обработка исключительных туаций 335

Помещение объекта стек

template <class StackType>

void stack<StaGkType>: :push (StackType ob)

{

if (tos==SIZE> {

cou Стек полон ;

return; : ..

stck[tos] = ob; tos++;

Выталкивание объекта из стека

template <class StackType>

StackType stack<StackType>: ;pop()

{ ,

if (tos==0) { *

cou << Стек ст ;

return 0; возврат нуля при пустом стеке

}

tOiS--;

return

intmain ( )

<

Демонстрация ствольных стеков stack<cliar> si, s2; создание двух стеков .int i ;

инициализация стеков sl.init;); s2.init();

э1.push (а ] s2.push(х) sl.pushCb ) s2.push(y ) sl.pushCc) s2.push(z)

for(i=0; i<3 for(i=0; i<3,

cout Из стека 1: sl.popO \n ; .1++) cou Из стека 2: з2.рор() << \n ;

Демонстрация стеков со значениями типа double stack<double ii, ds2; создание двух стеков

инициализация стеков dsl.initO ; ds2.init();



1 ... 106 107 108 [ 109 ] 110 111 112 ... 227

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика