Uniwersytet Zielonogórski
Wydział Informatyki, Elektrotechniki i Telekomunikacji Instytut Sterowania i Systemów Informatycznych
Informatyka stacjonarne-dzienne pierwszego stopnia z tyt. inżyniera
Laboratorium Programowania Obiektowego
Obsługa wyjątków
1. Stworzyć klasę z odpowiednią funkcją składową, rzucającą wyjątkiem. Wewnątrz tej klasy, umie- ścić klasę zagnieżdzoną celem wykorzystania jej jako obiektu wyjątku. Ma ona zawierać pojedynczy wskaźnik char* reprezentujący komunikat opisujący wyjątek. Wyposażyć ją w inicjalizujący kon- struktor domniemany, uzupełniający treść komunikatu. Napisać blok obsługujący wyjątek poprzez wyprowadzenie na ekran treści komunikatu.
2. Przeanalizować poniższy fragment programu i wyjaśnić jaka będzie wartość zmiennej i w przypadku, gdy obiekt E, jest typu:
a)const int E, b)int *E, c)int &E, d)float E, e)int *&E, f)const float & const E //...
int i=1;
try{
try{
throw E;}
catch(int &){i++;throw;}
catch(const int){i+=2;}
catch(float *){i-=2;}
catch(int *){i--;throw;}}
catch(int *){i*=2;}
catch(int){i--;}
catch(...){i--;}
//...
3. Dany jest następujący schemat dziedziczenia klas: A−→B−→C. W każdej z nich znajdują się wir- tualne metody nazwa wyświetlające nazwę typu obiektu na rzecz którego są wywoływane. Opisać efekt działania następujących operacji:
a) b) c)
try try try
{C ob1;throw ob1;} {C ob2;throw ob2;} {static C ob3;throw &ob3;}
catch(B ex1) catch(B &ex2) catch(A *ex3)
{ex1.nazwa();} {ex2.nazwa();} {ex3->nazwa();}
4. Utworzyć klasę z własnym operatorem new. Operator ten ma przydzielić pamięć dla wybranej losowo liczby obiektów (z przedziału od 5 do 50), a następnie zasymulować ”błąd wyczerpania pamięci” i zasygnalizować sytuację wyjątkową. Dodać statyczną metodę, która odzyska przydzieloną pamięć. Następnie utworzyć blok instrukcji programu odporny na wystąpienie tego typu wyjątku.
5. (Trywialne ale obowiązkowe!) Napisać funkcję main(), która przechwytuje wszystkie możliwe wyjątki i sygnalizuje je jako odpowiednie błędy.
6. (Obowiązkowe!) Utworzyć destruktor rzucający wyjątkiem i napisać program udowadniający, że takie rozwiązanie może prowadzić do niekontrolowanego zakończenia programu przez funkcję terminate(). Wykorzystać funkcję set terminate() do prawidłowego zamknięcia programu. Na- stępnie wykazać to samo w przypadku konstruktora kopiującego.
7. (Również obowiązkowe!) Prześledzić proces rzucania i obsługi wyjątku przy użyciu własnej klasy z konstruktorami inicjującym oraz kopiującym dostarczającymi możliwie wyczerpujących informacji o tym jak obiekt został utworzony. Rzucić wyjątkiem i przeanalizować rezultat. Pokazać, że obiekty rzucane są odpowiednio likwidowane, natomiast gdy rzucany jest wskaźnik do obiektu dynamicz- nego to nie jest zwalniana przypisana mu pamięć. Zaradzić tej sytuacji poprzez technikę ”przejęcia zasobów”.
8. * (Wzajemne wykluczanie!) W oparciu o obsługę wyjątków, zaprogramować symulację (w czasie dyskretnym) współdzielonego dostępu n użytkowników do m serwerów drukowania, przy założeniu że jeden serwer może obsłużyć w danej chwili tylko jednego użytkownika. Uwzględnić możliwości prób jednoczesnego dostępu do serwera, wystąpienia błędów komunikacyjnych oraz związanych z niemożnością wydruku, a także sytuacji awarii serwera.
Litertura
• Grębosz J.,Symfonia C++ standard, Edition 2000, 2008
• Grębosz J., Pasja C++, Edition 2000, 200
• Stroustrup B., Język C++, Wydawnictwa Naukowo-Techniczne 1994, 2000 i 2002
• Eckel B., Thinking in C++. Edycja polska, Helion , 2002