20
Туыстық функция template шешуші сөзі арқылы құрылады. Функция-
үлгі анықтамасының типтік формасы:
template < class T > мәнді_қайтару
функция_аты (параметрлер_тізімі)
{функция денесі}
Мұндағы T - берілгендер типінің жалған аты, оны компилятор
функцияның нақты нұсқасын құрғанда берілгендердің
шын типінің атымен
автоматты түрде ауыстырады.
Мағынасы ұқсас функциялар бар болғанда түрлі деректер типтері үшін
екі шаманың ең кішісін табу үшін MyMin атты жалғыз үлгілік функцияны
анықтауға болады:
template < class T > T MyMin (T x, T y)
{ if (x<=y) return x; else return y;}
Ол потенциалды түрде белгісіз T типімен де жұмыс істей алады.
Функциялар үлгілерінің келесі тақырыптары синтаксистік жағынан
дұрыс болып табылады:
template< class T > T Fun1(T x, T y, int z)
template
double Fun2 (Tx, Ty)
template W Fun3(Tx,Wy,bool z).
1)
Үлгінің формальды параметрлерінің анықтауыштары (T,W) ең
болмаса формальды параметрлер тізімінде бір рет болса да болу керек.
2)
Үлгілік функцияның денесі ішінде үлгінің формальды параметрлері
локальды
айнымалыларды
анықтау
операторларында,
типті
беру
операторларында және т. б. өзге түрлі деректердің нақты типтерімен бірдей
қолданылады, яғни жұмыс істеуде деректер типтерінің толық құқылы
атаулары сияқты.
3)
Кәдімгі функциялар сияқты үлгілік функцияларға да прототиптерді
жазуға болады, сонымен қатар оларға inline, static спецификаторларын да
жазуға болады (бұл спецификаторлар үлгінің формальды параметрлер
тізімінен кейін және функциямен қайтарылатын мән типіне дейін орналасу
керек).
4)
Функция үлгілерін анықтау мәтіні шақыру орындалатын файлдарда
немесе тақырыптық файлдарда (h-файлдарда) орналастырылу керек.
5)
Үлгілік функция анықталу алдында template кілттік сөзімен
нұсқаулық орналасу керек.
6)
Функция үлгілерінің механизмін дәлелсіз қолданудың ешқандай
қажеті жоқ! Біріншіден, функция үлгілерінің деректердің абстрактты
типтерімен байланысының пайдасы бар. Үлгілер механизмі глобальды
21
функциялар үшін емес кластар мен олардың әдістерінің үлгілері үшін ерекше
пайдалы!
Туыстық кластар.
Туыстық функцияларын толықтыру үшін туыстық кластарды да
анықтауға болады. Осы кластың объектілерін құру кезінде барлық қажетті
алгоритмдер анықталып, өңделетін деректердің нақты типтері параметрлері
ретінде кейінірек беріледі.
Туыстық кластар, класс құрамында
жұмыстың жалпы логикасын
қамтығанда пайдалы. Мысалы, бүтіндер кезегін жүзеге асыратын алгоритм
символдар кезегімен де жұмыс істейді. Сонымен пошталық адрестердің
байланысқан тізімін жүзеге асыратын механизм автомобильдерге арналған
қосалқы бөлшектердің байланысқан тізімін де қолдайтын болады. Туыстық
класс арқылы түрлі берілгендер типтеріне арналған байланысқан тізімдер
кезегін жүзеге асыратын класты құруға мүмкіндік береді. Компилятор
берілген
объектіні құруда, объектінің тип негізінде дұрыс типін автоматты
басқарады.
Класс үлгісінің сипатталу синтаксисі келесі түрде болады:
-
template < үлгі_параметрлерін_сипаттау > класс_анықтамасы
-
Параметрлер ретінде стандарттыға ұқсас қолданушымен анықталатын
типтер үлгілер мен типтелген конструктор қолданылады.
Бір байланысты тізімді жүзеге асыратын жай туыстық класты құрайық:
#include< iostream.h >
template< class T > class List
{ T data;
List*next;
рublic:
List(T d); // класс конструкторы
Void add(List*node)
{node next=this; next=0;}
List*getnext() {return next;}
T getdata(){return data;}
}
template< classT >List
::List(Td)
{data=d; next=0;}
int main(void)
{List< char > start(‘a’); //start-обьект
List< char >*p,*last;
//тізімді құру
last=&start;
for(int i=1; i<26;i++)
{p=newList (‘a’+i);
p->add(last); last=p;
22
}
//тізімді шығару
p=&start;
while(p)
{cout<
getdata();
p=p->getnext();
}
return 0;
}
Көрініп тұрғандай, туыстық класты жариялау туыстық функция
жариялануына ұқсас. Тізімде сақталынатын берілгендер типі класты
жариялағанда туыстыққа айналады, бірақ ол деректердің нақты типін беретін
объект жарияланбай көрінбейді. Объектті құрғанда
көрсетілген мәліметтер
типін өзгерту жолымен тізімде сақталған мәліметтер типін өзгертуге болады.
Кейбір қорытындыларды келтірейік және үлгілерді сипаттаудың негізгі
ережелерін атап өтейік:
1)
Класс үлгісінің ішінде тип параметрі тип спецификациясы
қолданылатын кез келген жерде қолданылады.
2)
Үлгі параметрінің әрекет ету облысы – үлгі параметрінің сипаттау
нүктесінен класс үлгісінің соңына дейін.
3)
Класс үлгісінің әдістері автоматты түрде функция үлгілеріне
айналады. Егер әдіс класс үлгісінен тыс сипатталса, онда әдіс тақырыбы
келесі құрылымға ие болу керек:
template<үлгі_параметрін_сипаттау>
типті_қайтару класс_аты < үлгі_параметрлері>::
Үлгі параметрлерін сипаттау әдіс тақырыбын сандық және позициялық
түрінде сақтай отырып, класс үлгісіне сәйкеес келу керек.
4)
Локальды кластар үлгілерді өз элементтері ретінде қолдана
алмайды.
5)
Класс үлгілерінің әдістері виртуальды бола алмайды.
6)
Класс үлгілеріне статикалық элементтер,
достық функциялар мен
кластар ене алады.
7)
Класс үлгісінің ішінде достық функциялардың үлгілерін анықтауға
болмайды.
8)
Класс үлгілері үлгіліктерден және жай кластардан туынды бола
алады, сонымен қатар үлгілік және жай кластар үшін базалық болып табыла
алады.
Бақылау сұрақтары:
1)
Класс үлгілерін анықтау мүмкіндігі не?
23
2)
Үлгілік функцияға арналған машиналық кодтың шын генерациясы
қалай және қашан жүргізіледі?
3)
Үлгілік функцияны шақырғанда нақтыландыру қалай орындалады?
4)
Белгілі бір функционалдық үлгінің қай функциясы маманданған деп
аталады?
5)
Кезекті жүзеге асыратын туыстық класты құрыңыз және көрсетіңіз.
Достарыңызбен бөлісу: