Programowanie Obiektowew języku C++ Zadania L9 Mirosław Głowacki 1,2 1 Akademia Górniczo-Hutnicza im. Stanisława Staszica w Ktrakowie Wydział Inżynierii Metali i Informatyki Stosowanej Katedra Informatyki Stosowanej i Modelowania 2 Uniwersytet im. Jana Kochanowskiego w Kielcach Wydział Matematyczno-Przyrodnmiczy Instytut Fizyki Zakład Informatyki Styczeń 2019 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 1 / 14
Spis treści 1 Zadanie L9 2 Podpowiedzi do zadań L9 3 Przykładowe rozwiązanie zadania L9 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 2 / 14
Zadanie L9 Zmodyfikuj program utworzony w ramach zadań L8 (dotyczącego dziedziczenia) tak, aby był on polimorficzny. Dadaj funkcję globalną Zyj w postaci: void Zyj(Zwierze &zwierze){ cout << &zwierze; zwierze.oddychaj(); zwierze.patrz(); zwierze.ruszaj(); } Zmodyfikuj (uprość) funkcję main zgodnie z poniższym kodem: int main(){ Ryba Losos; Losos.Opis("Ryba losos", 2, 3.5); Zyj(Losos); Ptak Wrobel; Wrobel.Opis("Wrobel", 1, 0.05); Zyj(Wrobel); Pies Azor; Azor.Opis(); Zyj(Azor); return 0;} Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 3 / 14
Zadanie L9 --- Prezentuje zwierze: Ryba losos --- Wiek w latach: 2 Masa w kg: 3.5 Oddycham skrzelami Spogladam spod wody Plyne, bo lubie plywac --- Prezentuje zwierze: Wrobel --- Wiek w latach: 1 Masa w kg: 0.05 Oddycham powietrzem z wysoka Spogladam z gory na ziemie Lece, bo lubie latac --- Prezentuje zwierze: Pies Azor --- Wiek w latach: 1 Masa w kg: 12 Rasa: 4 Umaszczenie: 3 Oddycham powietrzem domowym Spogladam na mojego wlasciciela Biegne, bo lubie biegac Wlasnie aportuje Hau, Hau Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 4 / 14
Spis treści 1 Zadanie L9 2 Podpowiedzi do zadań L9 3 Przykładowe rozwiązanie zadania L9 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 5 / 14
Podpowiedzi do zadań L9 Parametrem funkcji funkcji Zyj jest referencja, a więc może się ona zachowywać polimorficznie. Pierwsza linia kodu tej funkcji zawiera instrukcję, która odwołuje się do przeciążonego operatora strumienia wyjściowego dla wskaźnika &zwierze. Operator ten powinien mieć zatem deklarację: ostream& operator<<(ostream& Strum, Zwierze *zwierze); co umożliwia mu również zachowanie polimorficzne. Zatem funkcji Zyj można przesyłać obiekty klas pochodnych od zwierze, a operatorowi << wskaźniki do tych klas. Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 6 / 14
Podpowiedzi do zadań L9 operator<< powinien dodatkowo zawierać warunkowy blok instrukcji, który pozwoli na wypisanie dodatkowych informacji w przypadku, gdy jest to konieczne. W warunkach zadania konieczność taka istnieje dla obiektów klasy Pies. Blok warunkowy może w tym przypadku wyglądać np. tak: Pies *ps = dynamic_cast<pies*>(zwierze); if (ps){ Strum << " Rasa: " << ps->rasa() << endl; Strum << " Umaszczenie: " << ps->kolorsiersci() << endl;} Przy okazji zwóćmy uwagę, że przedstawiony fragment kodu wykorzystuje rzutowanie dynamiczne, a więc rzutowanie w dół hierarchii w trakcie wykonywania programu Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 7 / 14
Spis treści 1 Zadanie L9 2 Podpowiedzi do zadań L9 3 Przykładowe rozwiązanie zadania L9 Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 8 / 14
Przykładowe rozwiązanie zadania L9 #include <iostream> #include <string> using namespace std; class Zwierze { protected: double masa; unsigned wiek; string nazwa; public: Zwierze(): wiek(0) {} virtual void Patrz() = 0; virtual void Oddychaj() = 0; virtual void Ruszaj() = 0; double Masa() const {return masa;} unsigned Wiek() const {return wiek;} string Nazwa() const {return nazwa;} void Opis(string nazwazw = "Zwierze", unsigned wiekzw = 1, double masazw = 1.f){nazwa = nazwazw; wiek = wiekzw; masa =masazw;} }; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 9 / 14
Przykładowe rozwiązanie zadania L9 class Ryba : public Zwierze { public: void Plyn() {cout << "Plyne, bo lubie plywac" << endl;} void Patrz() {cout << "Spogladam spod wody" << endl;} void Oddychaj() {cout << "Oddycham skrzelami" << endl;} void Ruszaj() {Plyn();} }; class Ssak : public Zwierze { public: void Biegnij(){cout << "Biegne, bo lubie biegac" << endl;} void Patrz() {cout << "Spogladam na wprost" << endl;} void Oddychaj() {cout << "Oddycham powietrzem lesnym" << endl;} void Ruszaj() {Biegnij();} }; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 10 / 14
Przykładowe rozwiązanie zadania L9 class Ptak : public Zwierze { public: void Lec() {cout << "Lece, bo lubie latac" << endl;} void Patrz(){cout << "Spogladam z gory na ziemie" << endl;} void Oddychaj() {cout << "Oddycham powietrzem z wysoka" << endl;} void Ruszaj() {Lec();} }; enum RasaPsa {Owczarek, Dog, Pudel, Szpic, Bernardyn}; enum Umaszczenie {Czarny, Bialy, Rudy, Szary}; class Pies : public Ssak { protected: RasaPsa rasa; Umaszczenie kolorsiersci; public: Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 11 / 14
Przykładowe rozwiązanie zadania L9 public: void Aportuj(){cout << "Wlasnie aportuje" << endl;} void Szczekaj(){cout << "Hau, Hau" << endl;} RasaPsa Rasa()const {return rasa;} void Rasa(RasaPsa rasaps){rasa = rasaps;} Umaszczenie KolorSiersci() const {return kolorsiersci;} void KolorSiersci(Umaszczenie kolps){kolorsiersci = kolps;} void Patrz(){cout << "Spoglądam na mojego właściciela" << endl;} void Oddychaj() {cout << "Oddycham powietrzem domowym" << endl;} void Ruszaj() {Biegnij(); Aportuj(); Szczekaj();} void Opis(string nazwazw = "Pies Azor", unsigned wiekzw = 1, double masazw= 12.f, RasaPsa rasaps = Bernardyn, Umaszczenie kolorps = Szary){ nazwa = nazwazw; wiek = wiekzw; masa =masazw; rasa = rasaps; kolorsiersci = kolorps;} }; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 12 / 14
Przykładowe rozwiązanie zadania L9 ostream& operator<<(ostream& Strum, Zwierze *zwierze){ Strum << "--- Prezentuje zwierze: " << zwierze->nazwa() << " ---" << endl; Strum << "Wiek w latach: " << zwierze->wiek() << endl; Strum << " Masa w kg: " << zwierze->masa() << endl; Pies *ps = dynamic_cast<pies*>(zwierze); if (ps){ Strum << " Rasa: " << ps->rasa() << endl; Strum << " Umaszczenie: " << ps->kolorsiersci() << endl;} return Strum; } void Zyj(Zwierze &zwierze){ cout << &zwierze; zwierze.oddychaj(); zwierze.patrz(); zwierze.ruszaj(); } Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 13 / 14
Przykładowe rozwiązanie zadania L9 int main(){ Ryba Losos; Losos.Opis("Ryba losos", 2, 3.5); Zyj(Losos); Ptak Wrobel; Wrobel.Opis("Wrobel", 1, 0.05); Zyj(Wrobel); Pies Azor; Azor.Opis(); Zyj(Azor); } return 0; Mirosław Głowacki (AGH, UJK) Programowanie Obiektowe 2019 14 / 14