5.3. Stos 131
Idea klasy szablonowej polega na stworzeniu wzorcowego kodu, w którym typ pewnych danych (zmiennych, wartości zwracanych przez funkcje...) nie zostaje precyzyjnie określony, ale jest zastąpiony pewną stalą symboliczną. W naszym przypadku jest to stała TypPodst.
Zaletą tego typu postępowania jest dość duża uniwersalność tworzonej klasy, gdyż dopiero w funkcji main określamy, że np. TypPodst powinien zostać zamieniony na np. JJoat, char* lub jakiś złożony typ strukturalny. Wadą klasy szablonowej jest jednak dość dziwna składnia, której musimy się trzymać chcąc zdefiniować jej metody. O ile jeszcze definicje znajdują się w ciele klasy (tzn pomiędzy jej nawiasami klamrowymi), to składnia przypomina normalny kod C++. W momencie jednak gdy chcemy definicje metody umieścić poza klasą, to otrzymujemy tego rodzaju dziwolągi':
template <rdass TypPodst> int STOS<TypPodst>: : push(TypPodst x)
'ł
// element x zc3tanie położony na stos if ( szczyt<=DL(JGOSC_MAX)
(
t[szczyt++]=x;
return (OK);
)else
return (STOS_PELNY);
I
Metoda push, bowiem to jej kod mamy przed oczami, jest bardzo prosta, co jest zresztą cechą wszelkich realizacji tablicowych. Nowy element .v (jaki by nie był jego typ) jest zapisywany na szczyt stosu, który jest wskazywany w pry watnej dla klasy zmiennej szczyt. Następnie wartość szczytu stosu jest inkrementowana - to wszystko pod warunkiem, że stos nie jest już zapełniony!
Metoda pop wykonuje odwrotne zadanie, zdejmowany ze stosu element jest zapamiętywany w zmiennej w (przekazanej w wywołaniu przez referencję); zmień na szczyt jest oczywiście dekrementowana pod warunkiem że stos nie byt pusty (z próżnego to nawet i programista nie... naleje?):
template sclass TypPodsO int 3TOS<TypPodst>:: pop(TypPodst Iw)
3 Oczywiście, zawsze można się pocieszać, że ewentualnie mogłoby to zostać jeszcze bardziej skomplikowane... Ale żarty na bok, powyższe problemy wynikają z prostego faktu: C++ należy do grupy języków których kompilatory muszą znać precyzyjnie typ danych, które wchodzą w grę podczas programowania, stąd tez każdy zabieg, który służy uczynienia go pozornie nieczułym na typy danych, musi być nieco sztuczny. Warto wspomnieć przy okazji, że istnieją języki z zasady pozbawione pojęcia typu danych, np. Smaltalk-80 (jest to język obiektowy o zupełnie innej filozofii niż C++, który wydaje się przy nim swego rodzaju asemblerem obiektowym...).