Bogdan Kreczmer bogdan.kreczmer@pwr.wroc.pl Zakład Podstaw Cybernetyki i Robotyki Instytut Informatyki, Automatyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2008-2010 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową.
Niniejsza prezentacja została wykonana przy użyciu systemu składu L A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net
1 Szablony klas Wprowadzenie 2 Klasy z definicją podtypu Szablon dla klasy z podtypem
Szablony klas Szablony klas Wprowadzenie Szablony klas pozwalają na przedstawienie ogólnych pojęć i wzajemnych ich związków. Pozwalają na abstrahowanie od typu poszczególnych atrybutów związanych z danym pojęciem. Pozwalają programiście skoncentrować na ogólnych zależnościach i mechanizmach. Szablony pozwalają na generowanie i optymalizowania już na etapie kompilacji poprzez użycie specyficznych konstrukcji programistycznych. Umożliwiają realizację idei programowania uogólnionego.
Szablony klas Szablony klas Wprowadzenie Szablony klas pozwalają na przedstawienie ogólnych pojęć i wzajemnych ich związków. Pozwalają na abstrahowanie od typu poszczególnych atrybutów związanych z danym pojęciem. Pozwalają programiście skoncentrować na ogólnych zależnościach i mechanizmach. Szablony pozwalają na generowanie i optymalizowania już na etapie kompilacji poprzez użycie specyficznych konstrukcji programistycznych. Umożliwiają realizację idei programowania uogólnionego.
Szablony klas Szablony klas Wprowadzenie Szablony klas pozwalają na przedstawienie ogólnych pojęć i wzajemnych ich związków. Pozwalają na abstrahowanie od typu poszczególnych atrybutów związanych z danym pojęciem. Pozwalają programiście skoncentrować na ogólnych zależnościach i mechanizmach. Szablony pozwalają na generowanie i optymalizowania już na etapie kompilacji poprzez użycie specyficznych konstrukcji programistycznych. Umożliwiają realizację idei programowania uogólnionego.
Szablony klas Szablony klas Wprowadzenie Szablony klas pozwalają na przedstawienie ogólnych pojęć i wzajemnych ich związków. Pozwalają na abstrahowanie od typu poszczególnych atrybutów związanych z danym pojęciem. Pozwalają programiście skoncentrować na ogólnych zależnościach i mechanizmach. Szablony pozwalają na generowanie i optymalizowania już na etapie kompilacji poprzez użycie specyficznych konstrukcji programistycznych. Umożliwiają realizację idei programowania uogólnionego.
Szablony klas Szablony klas Wprowadzenie Szablony klas pozwalają na przedstawienie ogólnych pojęć i wzajemnych ich związków. Pozwalają na abstrahowanie od typu poszczególnych atrybutów związanych z danym pojęciem. Pozwalają programiście skoncentrować na ogólnych zależnościach i mechanizmach. Szablony pozwalają na generowanie i optymalizowania już na etapie kompilacji poprzez użycie specyficznych konstrukcji programistycznych. Umożliwiają realizację idei programowania uogólnionego.
Problemy z tłumaczeniem template wzorzec szablon
Problemy z tłumaczeniem template wzorzec szablon
Ogólna postać szablonu template < lista-parametrow-rozdzielonych-przecinkami > class Klasa {
Ogólna postać szablonu template < lista-parametrow-rozdzielonych-przecinkami > class Klasa { Dopuszczalne parametry: typ wbudowany lub zdefiniowany przez użytkownika, stała w czasie kompilacji (liczba, wskaźnik, znaki itp.), inny szablon.
Ogólna postać szablonu template < lista-parametrow-rozdzielonych-przecinkami > class Klasa { Dopuszczalne parametry: typ wbudowany lub zdefiniowany przez użytkownika, stała w czasie kompilacji (liczba, wskaźnik, znaki itp.), inny szablon.
Ogólna postać szablonu template < lista-parametrow-rozdzielonych-przecinkami > class Klasa { Dopuszczalne parametry: typ wbudowany lub zdefiniowany przez użytkownika, stała w czasie kompilacji (liczba, wskaźnik, znaki itp.), inny szablon.
Ogólna postać szablonu template < lista-parametrow-rozdzielonych-przecinkami > class Klasa { Dopuszczalne parametry: typ wbudowany lub zdefiniowany przez użytkownika, stała w czasie kompilacji (liczba, wskaźnik, znaki itp.), inny szablon.
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } Słowo kluczowe typename sygnalizuje, że parametr szablonu jest typem.
Przykład szablonu stosu template < class TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; }
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; }
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<float> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<double[100]> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::string> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream > } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream&> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<std::istream&> } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos< Stos< Stos< char[20] > > > } St;
Przykład szablonu stosu template < typename TYP > class Stos { TYP Tab[ROZ STOSU]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= ROZ STOSU? false : Tab[ Ilosc++] = El, true; }
Przykład szablonu stosu template < typename TYP, unsigned int Rozmiar > class Stos { TYP Tab[Rozmiar]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= Rozmiar? false : Tab[ Ilosc++] = El, true; }
Przykład szablonu stosu template < typename TYP, unsigned int Rozmiar > class Stos { TYP Tab[Rozmiar]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= Rozmiar? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<float, 100> } St;
Przykład szablonu stosu template < typename TYP, unsigned int Rozmiar= 100 > class Stos { TYP Tab[Rozmiar]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= Rozmiar? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<float, 100> } St;
Przykład szablonu stosu template < typename TYP, unsigned int Rozmiar= 100 > class Stos { TYP Tab[Rozmiar]; unsigned int Ilosc; public : Stos( ) { Ilosc = 0; } bool Pobierz(TYP& El) { return! Ilosc? false : El = Tab[ Ilosc], true; } bool Poloz(const TYP& El) { return Ilosc >= Rozmiar? false : Tab[ Ilosc++] = El, true; } int main( ) { Stos<float> } St;
Klasa z typem wyliczeniowym class EnkoderRobota { int Stan; public: EnkoderRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } Klasy z definicją podtypu Szablon dla klasy z podtypem
Klasa z typem wyliczeniowym class EnkoderRobota { int Stan; public: EnkoderRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } enum Klasy z definicją podtypu Szablon dla klasy z podtypem Urzadzenie { Naped, Skret, Wiezyczka, Ilosc
Klasa z typem wyliczeniowym class EnkoderRobota { int Stan; public: EnkoderRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } enum Klasy z definicją podtypu Szablon dla klasy z podtypem Urzadzenie { Naped, Skret, Wiezyczka, Ilosc int main( ) { EnkoderRobota Tab[EnkoderRobota::Ilosc]; Tab[EnkoderRobota::Naped].Zmien(2); }
Klasa z typem wyliczeniowym class EnkoderRobota { int Stan; public: EnkoderRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } enum Klasy z definicją podtypu Szablon dla klasy z podtypem Urzadzenie { Naped, Skret, Wiezyczka, Ilosc int main( ) { EnkoderRobota Tab[EnkoderRobota::Ilosc]; Tab[EnkoderRobota::Naped].Zmien(2); Tab[10].Zmien(2); }
Klasa z typem wyliczeniowym class EnkoderRobota { int Stan; public: EnkoderRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } enum Klasy z definicją podtypu Szablon dla klasy z podtypem Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { int Stan; public: PotencjometrRobota( ): Stan( ) {} int Wez( ) const { return Stan; } void Zmien(int Stan) { Stan = Stan; } enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(::Naped); StanPot.Wez(::Noga1);
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(::Naped); StanPot.Wez(::Noga1); StanPot.Wez(1);
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(::Naped); StanPot.Wez(::Noga1); StanPot.Wez(1); encoder.cpp: In function int main() : encoder.cpp:62: error: invalid conversion from int to PotencjometrRobota::Urzadzenie
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(EnkoderRobota::Naped); StanPot.Wez(PotencjometrRobota::Noga1);
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc typedef PotencjometrRobota typedef EnkoderRobota PotRob; EnkRob; int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(EnkoderRobota::Naped); StanPot.Wez(PotencjometrRobota::Noga1);
Synonimy dla nazw typów Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc typedef PotencjometrRobota typedef EnkoderRobota PotRob; EnkRob; int main( ) { StanEnkRob StanEnk; StanPotRob StanPot; } StanEnk.Wez(EnkRob::Naped); StanPot.Wez(PotRob::Noga1);
Definicja szablonu Szablony klas Wprowadzenie Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc class PotencjometrRobota { enum Urzadzenie { Noga1, Noga2, Noga3, Noga4, Ilosc
Definicja szablonu Szablony klas Wprowadzenie Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const { return TabCzytn[Urz].Wez( ); } void Zmien(typename TYP::Urzadzenie Urz, int Stan) { return TabCzytn[Urz].Zmien(Stan); }
Definicja szablonu Szablony klas Wprowadzenie Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const { return TabCzytn[Urz].Wez( ); } void Zmien(typename TYP::Urzadzenie Urz, int Stan) { return TabCzytn[Urz].Zmien(Stan); }
Definicja szablonu Szablony klas Wprowadzenie Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const { return TabCzytn[Urz].Wez( ); } void Zmien(typename TYP::Urzadzenie Urz, int Stan) { return TabCzytn[Urz].Zmien(Stan); }
Wykorzystanie szablonu Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const int main() { Stan<EnkoderRobota> StanEnk; } StanEnk.Wez(EnkoderRobota::Naped);
Wykorzystanie szablonu Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const int main() { Stan<EnkoderRobota> StanEnk; } StanEnk.Wez(EnkoderRobota::Naped); StanEnk.Wez(1);
Wykorzystanie szablonu Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { TYP TabCzytn[TYP::Ilosc]; public: int Wez(typename TYP::Urzadzenie Urz) const int main() { Stan<EnkoderRobota> StanEnk; } StanEnk.Wez(EnkoderRobota::Naped); StanEnk.Wez(1); encoder.cpp: In function int main() : encoder.cpp:62: error: invalid conversion from int to PotencjometrRobota::Urzadzenie encoder.cpp:62: error: initializing argument 1 of int Stan<TYP>::Wez(typename TYP::Urzadzenie) const [with TYP = PotencjometrRobota]
Synonimy nazw typów po raz drugi Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { public: int Wez(typename TYP::Urzadzenie Urz) const int main( ) { Stan<EnkoderRobota>StanEnkRob StanEnk; } StanEnk.Wez(EnkoderRobotaEnkRob::Naped);
Synonimy nazw typów po raz drugi Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { public: int Wez(typename TYP::Urzadzenie Urz) const typedef Stan<EnkoderRobota> typedef EnkoderRobota StanEnkRob; EnkRob; int main( ) { Stan<EnkoderRobota>StanEnkRob StanEnk; } StanEnk.Wez(EnkoderRobotaEnkRob::Naped);
Synonimy nazw typów po raz drugi Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { public: int Wez(typename TYP::Urzadzenie Urz) const typedef Stan<EnkoderRobota> typedef EnkoderRobota StanEnkRob; EnkRob; int main( ) { Stan<EnkoderRobota>StanEnkRob StanEnk; } StanEnk.Wez(EnkoderRobotaEnkRob::Naped);
Synonimy nazw typów po raz drugi Klasy z definicją podtypu Szablon dla klasy z podtypem class EnkoderRobota { enum Urzadzenie { Naped, Skret, Wiezyczka, Ilosc template <typename TYP> class Stan { public: int Wez(typename TYP::Urzadzenie Urz) const typedef Stan<EnkoderRobota> typedef EnkoderRobota int main( ) { StanEnkRob StanEnk; StanEnkRob; EnkRob; } StanEnk.Wez(EnkRob::Naped);