template <îïèñaíèå_ïaðaìåòðîâ_øaáëîía> îïðåäåëåíèå_êëañña;
Ïaðaìåòðû øaáëîía ïåðå÷èñëяþòñя ÷åðåç çaïяòóþ.  êa÷åñòâå ïaðaìåòðîâ ìîãóò èñïîëüçîâaòüñя òèïû, øaáëîíû è ïåðåìåííûå.
Òèïû ìîãóò áûòü êaê ñòaíäaðòíûìè, òaê è îïðåäåëåííûìè ïîëüçîâaòåëåì. Äëя èõ îïèñaíèя èñïîëüçóåòñя êëþ÷åâîå ñëîâî Class. Âíóòðè øaáëîía ïaðaìåòð òèïa ìîæåò ïðèìåíяòüñя â ëþáîì ìåñòå, ãäå äîïóñòèìî èñïîëüçîâaòü ñïåöèôèêaöèþ òèïa, íaïðèìåð:
template Class List{ Class NOde{
publiC:
Data d;
NOde *next;
NOde *prev;
NOde(Data dat = 0){d = dat; next = 0; prev= 0;}
};
…
}
Êëaññ Data ìîæíî ðaññìaòðèâaòü êaê ôîðìaëüíûé ïaðaìåòð, ía ìåñòî êîòîðîãî ïðè êîìïèëяöèè áóäåò ïîäñòaâëåí êîíêðåòíûé òèï äaííûõ.
Äëя ëþáûõ ïaðaìåòðîâ øaáëîía ìîãóò áûòü çaäaíû çía÷åíèя ïî óìîë÷aíèþ, ía- ïðèìåð:
template Class myarray { /* … */ };
…
template Class C = myarray> Class Map{
C key;
C value;
…
};
Îáëañòü äåéñòâèя ïaðaìåòða øaáëîía — îò òî÷êè îïèñaíèя äî êîíöa øaáëîía, ïîýòîìó ïaðaìåòð ìîæíî èñïîëüçîâaòü ïðè îïèñaíèè ñëåäóþùèõ ça íèì, íaïðè- ìåð:
template Class X { /* … */ };
Ìåòîäû øaáëîía êëañña aâòîìaòè÷åñêè ñòaíîâяòñя øaáëîíaìè ôóíêöèé. Åñëè ìå- òîä îïèñûâaåòñя âíå øaáëîía, åãî çaãîëîâîê äîëæåí èìåòü ñëåäóþùèå ýëåìåíòû:
template <îïèñaíèå_ïaðaìåòðîâ_øaáëîía> âîçâð_òèï èìя_êëañña <ïaðaìåòðû_øaáëîía >::
èìя_ôóíêöèè (ñïèñîê_ïaðaìåòðîâ ôóíêöèè)
Îïèñaíèå ïaðaìåòðîâ øaáëîía â çaãîëîâêå ôóíêöèè äîëæíî ñîîòâåòñòâîâaòü øaáëîíó êëañña, ïðè ýòîì èìåía ïaðaìåòðîâ ìîãóò íå ñîâïaäaòü. Ïðîùå ðaññìîò- ðåòü ñèíòaêñèñ îïèñaíèя ìåòîäîâ øaáëîía ía ïðèìåðå:
template vOid List::print()
{ /* òåëî ôóíêöèè */ }
Çäåñü — îïèñaíèå ïaðaìåòða øaáëîía, vOid — òèï âîçâðaùaåìîãî ôóíêöèåé çía÷åíèя, List — èìя êëañña, — ïaðaìåòð øaáëîía, print — èìя ôóíêöèè áåç ïaðaìåòðîâ.
 ñëó÷aå íåñêîëüêèõ ïaðaìåòðîâ ïîðяäîê èõ ñëåäîâaíèя â îïèñaíèè_ïaðaìåòðîâ è
ïaðaìåòðaõ_øaáëîía äîëæåí áûòü îäèí è òîò æå, íaïðèìåð:
template struCt A{ vOid f1();
};
template vOid A::f1(){ … }
Íèæå ïåðå÷èñëåíû ïðaâèëa îïèñaíèя øaáëîíîâ.
Ëîêaëüíûå êëaññû íå ìîãóò ñîäåðæaòü øaáëîíû â êa÷åñòâå ñâîèõ ýëåìåíòîâ.
Øaáëîíû ìåòîäîâ íå ìîãóò áûòü âèðòóaëüíûìè.
Øaáëîíû êëaññîâ ìîãóò ñîäåðæaòü ñòaòè÷åñêèå ýëåìåíòû, äðóæåñòâåííûå ôóíêöèè è êëaññû.
Øaáëîíû ìîãóò áûòü ïðîèçâîäíûìè êaê îò øaáëîíîâ, òaê è îò îáû÷íûõ êëaññîâ, a òaêæå яâëяòüñя áaçîâûìè è äëя øaáëîíîâ, è äëя îáû÷íûõ êëaññîâ.
Âíóòðè øaáëîía íåëüçя îïðåäåëяòü friend-øaáëîíû.
 êa÷åñòâå ïðèìåða øaáëîía ðaññìîòðèì ïîëíîå îïèñaíèå ïaðaìåòðèçîâaííîãî êëañña äâóñâяçíîãî ñïèñêa List.
template Class List{ Class NOde{
publiC:
Data d;
NOde *next, *prev;
NOde(Data dat = 0){d = dat; next = 0; prev= 0;}
};
NOde *pbeg, *pend; publiC:
List(){pbeg = 0; pend = 0;}
~List();
vOid add(Data d); NOde * find(Data i);
NOde * insert(Data key, Data d); bOOl remOve(Data key);
vOid print();
vOid print_baCk();
};
//-------------------------
template List ::~List(){
if (pbeg !=0){
NOde *pv= pbeg; while (pv){
pv= pv->next; delete pbeg; pbeg = pv;}
}
}
//-------------------------
template
vOid List ::print(){ NOde *pv= pbeg;
COut << endl << "list: "; while (pv){
COut << pv->d << ' '; pv= pv->next;}
COut << endl;
}
//-------------------------
template
vOid List ::print_baCk(){ NOde *pv= pend;
COut << endl << " list baCk: "; while (pv){
COut << pv->d << ' '; pv = pv->prev;}
COut << endl;
}
//-------------------------
template
vOid List ::add(Data d){ NOde *pv= new NOde(d);
if (pbeg == 0)pbeg = pend = pv; else{
pv->prev = pend; pend->next = pv; pend = pv;}
}
//-------------------------
template
NOde * List ::find(Data d){ NOde *pv= pbeg;
while (pv){
if(pv->d == d)break; pv= pv->next;
}
return pv;
}
//-------------------------
template
NOde * List ::insert(Data key, Data d){ if(NOde *pkey = find(key)){
NOde *pv= new NOde(d); pv->next = pkey->next;
pv->prev = pkey; pkey->next = pv;
if( pkey != pend)(pv->next)->prev = pv; else pend = pv;
return pv;} return 0;
}
//-------------------------
template
bOOl List ::remOve(Data key){ if(NOde *pkey = find(key)){
if (pkey == pbeg){
pbeg = pbeg->next; pbeg->prev= 0;} 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;
}
Åñëè òðåáóåòñя èñïîëüçîâaòü øaáëîí List äëя õðaíåíèя äaííûõ íå âñòðîåííîãî, a îïðåäåëåííîãî ïîëüçîâaòåëåì òèïa, â îïèñaíèå ýòîãî òèïa íåîáõîäèìî äîáa- âèòü ïåðåãðóçêó îïåðaöèè âûâîäa â ïîòîê (îá ýòîì ðaññêaçûâaåòñя â ðaçäåëå
«Ïîòîêè è òèïû, îïðåäåëåííûìè ïîëüçîâaòåëåì» ía ñ. 284) è ñðaâíåíèя ía ða- âåíñòâî, a åñëè äëя åãî ïîëåé èñïîëüçóåòñя äèíaìè÷åñêîå âûäåëåíèå ïaìяòè, òî è îïåðaöèþ ïðèñâaèâaíèя.
Ïðè îïðåäåëåíèè ñèíòaêñèña øaáëîía áûëî ñêaçaíî, ÷òî â íåãî, êðîìå òèïîâ è øaáëîíîâ, ìîãóò ïåðåäaâaòüñя ïåðåìåííûå. Îíè ìîãóò áûòü öåëîãî èëè ïåðå÷èñ- ëяåìîãî òèïa, a òaêæå óêaçaòåëяìè èëè ññûëêaìè ía îáúåêò èëè ôóíêöèþ.  òåëå øaáëîía îíè ìîãóò ïðèìåíяòüñя â ëþáîì ìåñòå, ãäå äîïóñòèìî èñïîëüçîâaòü êîíñòaíòíîå âûðaæåíèå.  êa÷åñòâå ïðèìåða ñîçäaäèì øaáëîí êëañña, ñîäåðæa- ùåãî áëîê ïaìяòè îïðåäåëåííîé äëèíû è òèïa:
template Class BlOCk{
publiC:
BlOCk(){p = new Type [kOl];}
~BlOCk(){delete [] p;} OperatOr Type *();
prOteCted:
Type * p;
};
template
BlOCk :: OperatOr Type *(){ return p;
}
Ïîñëå ñîçäaíèя è îòëaäêè øaáëîíû êëaññîâ óäîáíî ïîìåùaòü â çaãîëîâî÷íûå ôaéëû.
Do'stlaringiz bilan baham: |