Szablony

† Szablony funkcji

† Szablony klas

† Parametry szablonów

† Szablony a dziedziczenie

Pojęcie szablonu

† Szablon jako wzór do wykonywania jednakowych (lub podobnych) elementów

† Na podstawie jednego s

ie jednego szablon

ablonu

można wykonać wiele elementów

Szablon funkcji

† Przykład funkcji zwracającej większą liczbę z dwóch argumentów

int Wieksza(int a, int b)

{

if (a>b) return a; else return b;

}

† Funkcja nie działa poprawnie dla innych typów argumentów,

† Co daje w wyniku Wieksza(3.5, 3); ?

(J. Grębosz, Pasja C++)

Rozwiązanie – przeciążenie nazw funkcji

† Należy zadeklarować następujące funkcje: int Wieksza(int a, int b){

){

if (a>b) return a; else return b; }

float Wieksza(double a, double b){

){

if (a>b) return a; else return b; }

char Wieksza(char a, char b){

){

if (a>b) return a; else return b; }

† itd…

† Wada – konieczność wielokrotnego powtarzania prawie identycznego kodu

Utworzenie szablonu funkcji

† Zdefiniowanie szablonu funkcji: template <class moj_typ> moj typ

moj_typ funkcja(moj

typ

funkcja(moj_typ a

,

a, moj

typ

moj_typ b)

{

// Ciało funkcji

j

};

† template, class - słowa kluczowe

† moj_typ – identyfikator typu

† funkcja – nazwa funkcji

Lista typów parametrów

† W liście typów parametrów w nawiasach ostrych musi w

y

yst

y ąpić co najmniej jeden

typ

† Nazwa każdego typ

ypu musi być

y poprzedzona

słowem kluczowym class

„ template <class typ1, class typ2>

† Każdy z wymienionych typów musi przynajmniej raz wystąpić w liście argumentów funkcji

„ typ1 Funkcja(typ1 a, typ1 b, typ2 xx){};

Cechy funkcji szablonowych

† Szablony funkcji należy umieszczać w zakresie globalnym

† Kompilator generuje implementacje poszczególnych wersji funkcji szablonowych w momencie ich pierwszego wywołania

† Użycie szablonów funkcji skraca kod programu źród

ź

łowego

† Użycie szablonów funkcji ułatwia dokonywanie poprawek w kodzie źródłowym

† Nie ma oszczędności pamięci po kompilacji

Szablony a typy zdefiniowane

† W funkcjach szablonowych można używać typów zdefiniowanych

y

„ Jeżeli są zdefiniowane użyte operatory

„ Przykład – klasa TWektor

class TWektor{

public:

int x, y;

TWektor(int a

int

,

b):x(a)

y(b){};

,

};

Ograniczenia szablonów funkcji

† Kolejność parametrów

„ typ1 Wieksza(typ

yp1 a, typ2 b);

„ Jaki wynik dadzą:

† Wywołanie: Wieksza(5, 5.3

,

);

);

† Wywołanie: Wieksza(5.3, 5);

† Szablon będąc

ą y szcze

y

gólnym

y

przypadkiem innego

„ Możliwość zdefiniowania

„ Konstrukcja wieloznaczna (ambiguous) przy próbie użycia

Szablony klas

† Działają na podobnej zasadzie jak szablony funkcji

† Za pomocą szablonu można

a t

u omat

tomatycznie

nie wygene

generować

a esta

zestaw

klas

† Klasy wygenerowane przez szablon różnią si

ą ę typem danych na któr

y

ych

y

pracują

Przykład klasy i szablonu

class TSkrytka{

int Zawartosc;

public:

void Zapisz(int a){ Zawartosc = a; }; int Zwroc(void){ return Zawartosc; };

}

template <class typ_arg> cl

TSk

ass

rytk {

a

typ_arg Zawartosc;

public:

void Zapisz(typ_arg a){ Zawartosc = a; }; typ_arg Zwroc(void){ return Zawartosc; };

}

Deklaracja obiektu klasy

szablonowej

† Deklaracja obiektu:

„ NAZWA_KLASY<par_akt> OBIEKT;

† Przykład:

„ TSkrytka<int> Pierwsza;

„ TSkrytka<char> Druga;

† UWAGA:

„ Klasa – jest przepisem na obiekt

„ S a

z blon klas

ablon klasy – jest o

jest wzorem

do

em do

definiowania klas

Deklarowanie szablonów klas

† Nazwa szablonu klasy

„ Dowolny dozwolon

y

y ident

y

yfikato

y

r

„ Unikalna – nie można stosować przeciążenia nazw szablonów klas

† Szablony muszą być deklarowane w zakresie globalnym

„ Nie można zagnieżdżać szablonów klas

† Przykłady definicji obiektów

„ NAZWA_KLASY<par_akt>* OBIEKT;

„ NAZWA_KLASY<par_akt> TABLICA[N];

Parametry szablonów klas

† Lista parametrów formalnych nie może być

y pusta

† Dozwolone parametry szablonu klasy:

„ Nazwa typu (wbudowanego lub zdefiniowanego)

„ Stał

Sta e w

e yr

y aż

a eni

e e,

e, w ty

t m:

y

† Wartość

† Adres zmiennej lub obiektu

† Adres funkcji lub statycznego składnika klasy

Parametry szablonów klas, cd.

† Parametrami szablonu klasy nie mogą być

by

„ Stałe typu znakowego

„ Adresy elementów tablic

„ Adresy składników klas, poza statycznymi

„ Typy definiowane lokalnie (np. klasa zagnieżdżona wewnątrz funkcji)

„ Stałe dosłowne, jeżeli parametrem formalnym jest obiekt

Definicja funkcji składowych

† Inline

† Na zewnątrz deklaracji szablonu

„ D f

e i

fini j

c a j

j k

a k szabl

blonu f

funk j

c i

ji

† Przykład:

„ Deklaracja funkcji wewnątrz klasy: y

void Zapisz(jakis_typ xx);

„ Definicja funkcji na zewną Definicja funkcji na zewn trz klasy: template <class jakis_typ> void Skrytka<

y

jakis_typ

yp>::Zapisz(jakis t

_ yp

yp xx){

Zawartosc = xx;

};

Dynamiczne obiekty szablonowe

† Deklaracja wskaźnika

„ Skrytka<int> *wsk;

† Utworzenie obiektu, np:

„ wsk = new Skrytka<int>(120);

† Wywo

y

łanie metody obiektu

y

„ wsk->Przypisz(234);

† Zwolnienie pamię

Zwolnienie pami ci

„ delete wsk;

Składniki statyczne

ł

w klasach

szablonowych

† Składniki statyczne są wspólne dla poszczególnych klas

y

szablonowych

y

† Definicja składnika statycznego:

„ Wewnątrz klasy:

static int Licznik;

„ Na zewną

Na zewn trz klasy:

template <class jakis_typ> int Skrytka<jakis

j

t

_ yp

yp>::Licznik;

„ Przykład, w konstruktorze: Licznik++;

Parametr szablonu – nazwa typu

† template <class jakis_typ>

„ Parametrem moż

Parametrem mo e by

ż

ć

e by typ wbudowany

lub zdefiniowany (klasa)

„ Wewnątrz szablonu można definiować

† Obiekty typu jakis_typ

jakis_typ a,b;

† Wskaźniki do obiektów tego typu jakis_typ *X, *Y;

† Tablice obiektów tego t

tego typu

jakis_typ Tab[10];

Specjalizowane klasy szablonowe

† Klasy szablonowe są generowane przez kompilator

† Jedna lub kilka wersji klasy szablonowej moż

szablonowej mo e być

e by zdefiniowana

ć

„ręcznie” przez programistę

† Przykł

Przyk ad:

class TSkrytka<int*>{ //… }; Definicja specjalizowanej wersji klasy TSkrytka

Deklaracje przyjaźni w szablonach klas

† Przypomnienie: przyjacielem może być:

„ F

k

un j

c a

„ Klasa

† Wewnąt

rz szabl

bl

onu moż

na zadekl

kl

ć

arowa

przyjaźń

„ Wszystkich klas

Wszystkich

wygenerowanych z szablonu z jedną funkcją lub klasą

„ Każ

Ka da klasa wygenerowana z szablonu bę wygenerowana z szablonu b dzie miała swoją funkcję (klasę) zaprzyjaźnioną

Przykład – wspólny przyjaciel template <class jakis_typ> class TSkrytka{

...

friend void Inspektor();

}

† Funkcja Inspektor() ma dostęp do t

prywa nyc h

h skł

k d

a

i

n kó

ikó tki

w wszystki h

c

kl

h kl

as

wygenerowanych z szablonu

Przykład

ł

–

ad osobny przyjaciel dla

każdej klasy szablonowej

template <class jakis_typ> class TSkrytka{

...

friend void Inspektor(TSkrytka<jakis_typ> S);

}

template<class jakis_typ> void Inspektor(TSkrytka<jakis_typ> S)

{ cout << ”Zawartosc:” << S.Zawartosc; }

† Funkcja zaprzyjaźniona musi być funkcją szablonową

szablonow

Szablony a dziedziczenie

† Zwykła klasa może mieć jako przodka:

„ Inną zwykłą klasę

„ Klasę szablonową

† Szablon klas może mieć jako przodka:

„

k

Zwy ł

k ą klasę

„ Klasę szablonową

„ Szablon klas

† Specjalizowana klasa szablonowa może mieć jako przodka:

„ Zwykłą klasę

„ Klasę szablonową

Szczegóły: J. Grębosz, Pasja C++, tom I