[ Pobierz całość w formacie PDF ]
.i uzupełnia go o wzorce[Author ID1: at Mon Nov 12 15:23:00 2001]wzorce, przetwarzanie za pomocą obiektu ostream oraz obsługę wyjątków.Wynik działania jest identyczny.W liniach od 36.do 40.zostało zadeklarowanych kilka klas wyjątków.W zastosowanej w tym programie nieco prymitywnej obsłudze wyjątków, dla wyjątków nie są wymagane żadne dane ani metody; obiekty wyjątków służą jako znaczniki w instrukcjach catch, które wypisują bardzo prosty komunikat i wychodzą.Bardziej stabilny program mógłby przekazywać te wyjątki poprzez referencje, a następnie wydzielać z nich kontekst lub inne dane obiektu wyjątku w celu podjęcia próby rozwiązania problemu.W linii 45.abstrakcyjna klasa bazowa Part została zadeklarowana dokładnie tak samo, jak w poprzednim programie podsumowującym wiadomości.Jedyną interesującą zmianą jest wystąpienie nie należącego do klasy operatora<<(), zadeklarowanego w liniach od 70.do 74.Zwróć uwagę, że nie jest to ani funkcja składowa klasy Part, ani funkcja zaprzyjaźniona tej klasy.[Author ID1: at Mon Nov 12 15:23:00 2001] i klasę [Author ID1: at Mon Nov 12 15:26:00 2001]Part[Author ID1: at Mon Nov 12 15:25:00 2001] [Author ID1: at Mon Nov 12 15:25:00 2001] [Author ID1: at Mon Nov 12 15:26:00 2001]Otrzymuje on [Author ID1: at Mon Nov 12 15:25:00 2001]jedyniejedynie jako referencję[Author ID1: at Mon Nov 12 15:25:00 2001] w jednym ze swoich argumentów referencję do obiektu [Author ID1: at Mon Nov 12 15:25:00 2001]Part[Author ID1: at Mon Nov 12 15:25:00 2001].Możesz kiedyś zechcieć, by operator<< przyjmował klasy[Author ID1: at Mon Nov 12 15:26:00 2001]ę[Author ID1: at Mon Nov 12 15:26:00 2001] CarPart i AirPlanePart (w nadziei[Author ID1: at Mon Nov 12 15:26:00 2001]j[Author ID1: at Mon Nov 12 15:26:00 2001],[Author ID1: at Mon Nov 12 15:28:00 2001] że zostanie[Author ID1: at Mon Nov 12 15:27:00 2001]ły[Author ID1: at Mon Nov 12 15:27:00 2001] wywołany właściwy operator<<, w zależności od tego, jaki obiekt zostałby[Author ID1: at Mon Nov 12 15:27:00 2001] czy [Author ID1: at Mon Nov 12 15:27:00 2001]przekazana[Author ID1: at Mon Nov 12 15:28:00 2001]y[Author ID1: at Mon Nov 12 15:28:00 2001] została część samochodu czy samolotu[Author ID1: at Mon Nov 12 15:28:00 2001]).Ponieważ program przekazuje wskaźnik do części, a nie wskaźnik do części samochodu i części samolotu, więc C++ musiałoby wywoływać właściwą metodę w oparciu na[Author ID1: at Mon Nov 12 15:29:00 2001]o[Author ID1: at Mon Nov 12 15:29:00 2001] rzeczywistym[Author ID1: at Mon Nov 12 15:29:00 2001] typie[Author ID1: at Mon Nov 12 15:29:00 2001] jednego z argumentów funkcji.Nazywa się to kontrawariancją i nie jest obsługiwane w C++.W C++ istnieją tylko dwa sposoby uzyskania polimorfizmu: polimorfizm funkcji oraz funkcje wirtualne.Polimorfizm funkcji tutaj nie zadziała, gdyż w każdym przypadku dopasowujemy tę samą sygnaturę: sygnaturę przyjmującą referencję do klasy Part.Funkcje wirtualne także nie zadziałają, gdyż operator<< nie jest funkcją składową klasy Part.Nie możemy uczynić z tej funkcji funkcji składowej, gdyż chcemy wywoływać:cout << theParta to oznacza, że rzeczywistym wywołaniem będzie cout.operator<<(Part&), a cout nie posiada wersji operatora<< przyjmującego referencję do klasy Part!Aby ominąć to ograniczenie, w tym programie używamy tylko jednego operatora<<, przyjmującego referencję do klasy Part.Funkcja ta wywołuje następnie metodę Display(), która jest wirtualną funkcją składową.W ten sposób zostaje wywołana właściwa metoda.W liniach od 130.do 143.klasa Node jest zadeklarowana jako wzorzec[Author ID1: at Mon Nov 12 15:30:00 2001]wzorzec.Służy do tego samego celu, co klasa Node w poprzednim programie podsumowującym wiadomości, ale ta wersja klasy nie jest związana z obiektem Part.W rzeczywistości może być węzłem o dowolnym typie obiektu.Zauważ, że jeśli chcesz uzyskać obiekt z klasy Node,[Author ID1: at Mon Nov 12 15:30:00 2001] w której nie ma obiektu, będziejest[Author ID1: at Mon Nov 12 15:30:00 2001] to uznane za wyjątek, który jest zgłaszany w linii 175.W liniach 182.i 183.został zdefiniowany wzorzec[Author ID1: at Mon Nov 12 15:31:00 2001]wzorzec ogólnej klasy List.Klas ta może przechowywać węzły będące dowolnymi obiektami, posiadającymi unikalne numery identyfikacyjne, utrzymując je posortowane w kolejności od najmniejszego do największego.Każda z funkcji listy sprawdza, czy nie wystąpiła sytuacja wyjątkowa i w razie potrzeby zgłasza odpowiedni wyjątek.W linii[Author ID1: at Mon Nov 12 15:32:00 2001]ach 307 i[Author ID1: at Mon Nov 12 15:32:00 2001] 309[Author ID1: at Mon Nov 12 15:32:00 2001].8[Author ID1: at Mon Nov 12 15:32:00 2001] program sterujący tworzy listę dwóch typów obiektów Part, po czym, korzystając ze standardowego mechanizmu strumieni, wypisuje wartości obiektów w liście[Author ID1: at Mon Nov 12 15:32:00 2001]z listy[Author ID1: at Mon Nov 12 15:32:00 2001].Często zadawane pytanieW komentarzu powyżej linii 70.wspominasz, że C++ nie obsługuje kontrawariancji.Czym jest kontrawariancja?Odpowiedź: Kontrawariancja jest zdolnością przypisania wskaźnika do klasy bazowej wskaźnikowi do klasy pochodnej.Gdyby C++ obsługiwało kontrawariancję, moglibyśmy w czasie działania programu przeciążać funkcję w oparciu o faktyczny typ obiektu.Listing 21.10 nie skompiluje się w języku C++, ale skompilowałby się, gdyby język ten obsługiwał kontrawariancję.OSTRZEŻENIE Ten listing się nie skompiluje!Listing 21.10.#include <iostream [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • katek.htw.pl






  • Formularz

    POst

    Post*

    **Add some explanations if needed