template
Transkrypt
template
Programowanie obiektowe Wykład 8 Dariusz Wardowski dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Programowanie obiektowe Wykład 8 Wielokrotne wykorzystywanie kodu Poza dziedziczeniem oraz kompozycją klas, język C++ udostępnia kolejne narzędzie w postaci szablonów, które służą do wielokrotnego wykorzystywania kodu. Szablony służą do tworzenia ogólnych deklaracji klas (lub funkcji). W ten sposób realizowana jest koncepcja tzw. typów sparametryzowanych. Typ jest argumentem przekazywanym do ogólnego wzorca klasy lub funkcji. Stos<int> s1; Stos<double> s2; Stos<Pracownik> s3; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 2/14 Programowanie obiektowe Wykład 8 Klasa Punkt i klasa … Punkt class Punkt { private: int x, y; public: Punkt(); Punkt(int,int); int getX(); int getY(); void setXY(int,int); }; class Punkt { private: double x, y; public: Punkt(); Punkt(double,double); double getX(); double getY(); void setXY(double,double); }; Dobrym rozwiązaniem jest zamiana powyższych klas na jedną definicję szablonu, posługując się tzw. parametrem typów. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 3/14 Programowanie obiektowe Wykład 8 Szablon klasy #ifndef PUNKTTP_H_ #define PUNKTTP_H_ template <typename T> class Punkt { private: T x, y; public: Punkt(); Punkt(T,T); T getX(); T getY(); void setXY(T,T); void wypisz(); }; template <typename T> Punkt<T>::Punkt() { x = y = 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ template <typename T> Punkt<T>::Punkt(T _x, T _y) { x = _x; y = _y; } template <typename T> T Punkt<T>::getX() { return x; } template <typename T> T Punkt<T>::getY() { return y; } template <typename T> void Punkt<T>::setXY(T _x, T _y) { x = _x; y = _y; } #endif 4/14 Programowanie obiektowe Wykład 8 Konkretyzacja szablonu Chcąc wygenerowad klasę na podstawie zdefiniowanego szablonu należy jawnie określid typ parametru (tzn. dokonad jawnej konkretyzacji typu). #include <iostream> #include "Punkttp.h" using namespace std; int main() { Punkt<int> p(3,2); cout << p.getX(); Konkretyzując klasę możemy użyd zarówno typu wbudowanego jak i obiektu jakiejś klasy. Punkt<double> z(3.2,2.1); z.setXY(5.01,3); return 0; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 5/14 Programowanie obiektowe Wykład 8 Szablon tablicy template <typename Typ, int n> class TabTP { private: Typ tablica[n]; public: TabTP() {}; explicit TabTP(Typ &); virtual Typ & operator[](int); }; Template<typename Typ, int n> TabTP<Typ,n>::TabTP(Typ & w) { for (int i=0; i<n; i++) tablica[i]=w; } Typ – argument typu n – argument wyrażenia TabTP<double,10> t1; TabTP<int,100> t2; TabTP<char,20> t3; Template<typename Typ, int n> Typ & TabTP<Typ,n>::operator[](int i) { if (i<0 || i>=n) {cerr << „Blad!”; exit(1);} return tablica[i]; } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 6/14 Programowanie obiektowe Wykład 8 Nie-typy, czyli argumenty wyrażenia Argumenty wyrażenia podlegają następującym ograniczeniom: -Typ argumentu może byd: całkowity, wyliczeniowy, referencją, wskaźnikiem - W kodzie szablonu nie można zmieniad wartości argumentu - W kodzie szablonu nie można pobierad adresu argumentu - Przy konkretyzacji szablonu wartośd użyta dla argumentu powinna byd stałą dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 7/14 Programowanie obiektowe Wykład 8 Dziedziczenie i szablony Szablony klas mogą służyd do tworzenia klas, które będą pełniły rolę klas macierzystych. template <typename T1> class A { private: T x; … }; template <typename T2> class B: public A<T2> { … } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 8/14 Programowanie obiektowe Wykład 8 Klasy szablonowe jako składowe innych klas Klasy szablonowe mogą służyd jako składowe dla innych klas szablonowych. template <typename T1> class A { … }; template <typename T2> class B { A<T2> y; … } dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 9/14 Programowanie obiektowe Wykład 8 Klasa szablonowa jako argument typu Klasy szablonowe mogą stanowid argument typu dla innych szablonów. template <typename T1> class A { … }; template <typename T2> class B { … } A< B<int> > x; Inny przykład: Tablica < Stos<double> > TAB; //tablica stosów liczb zmiennoprzecinkowych dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 10/14 Programowanie obiektowe Wykład 8 Rekurencja w szablonach Konkretyzując szablon możemy korzystad z rekurencji: TabTP< TabTP<double,10>, 20> T; T jest dwudziestoelementową tablicą, w której każdy element jest dziesięcioelementową tablicą liczb zmiennoprzecinkowych. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 11/14 Programowanie obiektowe Wykład 8 Więcej niż jeden argument typu W języku C++ możemy używad szablony, które posiadają więcej niż jeden argument typu. Korzystając z tej możliwości możemy utworzyd klasę do przechowywania dwóch elementów różnych typów. template <typename T1, typename T2> class Pair { private: T1 x, T2 y; public: T1 & first(const T1 & f) {x = f; return x;}; T2 & second(const T2 & s) {y = s; return y;}; T1 first() const {return x;} T2 second() const {return y;} Pair(const T1 & f, const T2 & s) : x(f), y(s) {} Pair(){} }; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 12/14 Programowanie obiektowe Wykład 8 Użycie szablonu Pair Pair<int,double> points[4] = { Pair<int,double>(1,1.2), Pair<int,double>(-4,1.0), Pair<int,double>(100,0.45), Pair<int,double>(12,1.2) }; Pair<char *, int> adresy[2] = { Pair<char *, int>(„ul. Banacha”,22), Pair<char *, int>(„ul. Zielona”,13) }; dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 13/14 Programowanie obiektowe Wykład 8 Dziękuję za uwagę dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 14/14