231
else if (pkey == pend){ // Тізім соңынан өшіру
pend = pend->prev;
pend->next = 0;}
else {
// Тізім ортасынан өшіру
(pkey->prev)->next = pkey->next;
(pkey->next)->prev = pkey->prev;}
delete pkey;
return true;}
return false;
}
Тізімді тура жəне кері бағыттарды басып шығару əдістері соларға сəйкес
сілтемелер арқылы көше отырып, тізімді жеке элементтер бойынша қарап
шығады:
void List::print(){
Node *pv = pbeg;
cout << endl << "list: ";
while (pv){
cout << pv->d << ' ';
pv = pv->next;}
cout << endl;
}
void List::print_back(){
Node *pv = pend;
cout << endl << " list back: ";
while (pv){
cout << pv->d << ' ';
pv = pv->prev;}
cout << endl;
}
Тізім деструкторы оның барлық элементтерінен жадыны босатады:
List::~List(){
if (pbeg != 0){
Node *pv = pbeg;
while (pv){
pv = pv->next;
delete pbeg;
pbeg = pv;}
}
}
Төменде
List
класын қолданатын программа мысалы көрсетілген. Про-
грамма 125 б. келтірілген программаға ұқсас: ол 5 саннан тұратын тізімді
қалыптастырады, оны экранға шығарады, санды тізімге қосады, тізімнен сан-
ды өшіреді жəне оны қайтадан экранға шығарады:
232
int main(){
List L;
for (int i = 1; i<6; i++) L.add(i);
L.print();
L.print_back();
L.insert(2, 200);
if (!L.remove(5)) cout << «not found»;
L.print();
L.print_back();
}
List
класы бүтін сандарды сақтауға арналған. Онда кез келген типтегі
мəліметтерді сақтау үшін бұл класты шаблон ретінде сипаттап, типті параметр
ретінде беру керек.
Шаблонды сипаттау синтаксисі:
template <шаблон_параметрлерін_сипаттау> класс_анықтамасы;
Шаблонның параметрлері үтір арқылы бөліне отырып, тізбектеле жазыла-
ды. Параметрлер ретінде типтер, шаблондар жəне айнымалылар қолданылуы
мүмкін.
Типтер стандартты немесе қолданушы анықтаған тип болуы мүмкін.
Оларды сипаттау үшін
class
түйінді сөзі қолданылады. Шаблонның ішінде
тип спецификациясын қолдануға болатын кез келген жерде тип параметрін
пайдалануға болады, мысалы:
template class List{
class Node{
public:
Data d;
Node *next;
Node *prev;
Node(Data dat
=
0){d
=
dat; next
=
0; prev
=
0;}
};
...
}
Data
класын формалды параметр ретінде қарастыруға болады, компиля-
ция кезінде оның орнына нақты көрсетілген мəліметтер типі қойылады.
Шаблонның кез келген параметрлері үшін келісім бойынша мəндер
тағайындауға болады, мысалы:
template class myarray { /* ... */ };
...
template
K,
class
V,
template
class
С
=
myarray>
class Map{
C key;
233
C value;
...
};
Шаблон параметрінің əрекет ету аймағы оның сипатталу нүктесінен бастап
шаблонның соңына дейінгі кеңістік болады, сондықтан параметрді одан кейін
орналасқан параметрлерді сипаттау кезінде де қолдануға болады, мысалы:
template class X { /*...*/};
Класс шаблонының əдістері автоматты түрде функция шаблондарына ай-
налады. Егер əдіс шаблоннан тыс сипатталса, онда оның тақырыбында келесі
элементтер болуы тиіс:
template <шаблон_параметрлерінің_сипаттамасы>
қайт_тип класс_атауы <шаблон_параметрлері >::
функция_атауы (функцияның параметрлер_тізімі)
Функцияның тақырыбындағы шаблон параметрлерінің сипаттамасы
класс шаблонына сəйкес болуы керек, мұнда параметрлердің атаулары бірдей
болмауы мүмкін. Шаблон əдістерінің сипатталу синтаксисін мысал арқылы
қарастырған жеңіл болады:
template void List::print()
{ /* функция тұлғасы */ }
Мұндағы
– шаблон параметрінің сипаттамасы,
void
–
функцияның қайтаратын мəнінің типі,
List
– класс атауы,
– шаблон
параметрі,
print
– параметрлерсіз функцияның атауы.
Бірнеше параметр болған жағдайда
параметрлер_сипаттамасындағы
жəне
шаблон_параметрлеріндегі
олардың орналасу реттілігі бірдей болуы
керек, мысалы:
template
class T2> struct A{
void fl ();
};
template void A::f1(){...}
Төменде шаблондарды сипаттау ережелері көрсетілген.
□ Жергілікті кластар шаблондарды өздерінің элементтері ретінде кабыл-
дай алмайды.
□ Əдістердің шаблондары виртуалды бола алмайды.
□ Класс шаблондарында статикалық элементтер, достас функциялар
жəне кластар болуы мүмкін.
□ Шаблондар басқа шаблондардан немесе қарапайым кластардан туынды
болып, сонымен қатар шаблондар мен қарапайым кластар үшін базалық
болуы да мүмкін.
□ Шаблон
ішінде
friend
-шаблондарды анықтауға болмайды.
234
Шаблонның мысалы ретінде
List
екібайланысты тізімінің параметрлен-
ген класының толық сипаттамасын қарастырайық.
Достарыңызбен бөлісу: