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