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
Konwersja i dziedziczenie II
1. (Obowiązkowe - łańcuchy raz jeszcze!) Wewnątrz klasy:
class string int roz;
char *wsk;
public:
//...metody };
nie ma zdefiniowanej funkcji ostream& operator<<(ostream&,string&). Napisz funkcję konwer- tującą tak, aby poprawne były instrukcje:
string s("ABC"); cout<<s<<endl;
2. Przeprowadzić następujące eksperymenty i zinterpretować wyniki.
a) Dane są konwersje zdefiniowane przez użytkownika: X −→ Y , Y −→ Z. Czy istnieje niejawna konwersja X −→ Z?
b) Dana jest konwersja X −→ f loat. Czy istnieje konwersja X −→ int?
c) Dane są konwersje: X −→ f loat, X −→ int, X −→ char. Czy poprawna jest instrukcja cout<<x<<endl, gdzie x jest obiektem klasy X?
Jeżeli podane niejawne konwersje są niemożliwe, to czy można je przeprowadzić bez dodawania nowych metod konwertujących?
3. (Obowiązkowe!) Wykorzystując mechanizm dziedziczenia zbudować klasy odzwierciedlające na- stępujący graf:
A
B C
D E
F G
H I J
K L M
¡¡ ª @@R
¡¡ ª @@R ¡¡ª
¡¡
¡ ª
¡¡ ª @@R
¡¡
© ª
©©
¼ ?HHHj
©©
©
¼ ?HHHj
?
Każda klasa pochodna ma posiadać co najmniej jedną zmienną dodatkową względem swoich klas podstawowych. Dziedziczenie wykonać na dwa sposoby: konwencjonalnie i z użyciem klas wirtual- nych. W programie głównym zadeklarować obiekty każdej z klas i sprawdzić, które z nich najbardziej zyskują (i czy w ogóle zyskują?) na dziedziczeniu wirtualnym (do sprawdzenia wielkości obiektu zastosować funkcję sizeof()).
4. (Obowiązkowe!) Skonstruować klasy odzwierciedlające następujący graf dziedziczenia:
A
B C
D E F
G H
©©
©
¼ HHHj
© ?
©©
¼ HHHj©¼©©HHHj HHHj©¼©©HHHj©¼©©
Dodatkowo obiekt każdej klasy zawiera w sobie po jednym obiekcie klas, od których bezpośrednio dziedziczy. Przykładowo, obiekt klasy E, dla której klasami podstawowymi są A, B oraz C, posiada jako komponenty po jednym elemencie typu A, B i C. Dla każdej z klas zdefiniować konstruktor i destruktor, a następnie w programie głównym przetestować kolejność ich wywoływania dla obiektu każdego z zadeklarowanych typów.
5. Niech będzie dany następujący typ danych:
class tablica1D{
protected:
int rozmiar1;
int *tab;
};
reprezentujący dynamiczną tablicę jednowymiarową.
a) rozbudować klasę o domniemany konstruktor inicjalizujący, destruktor, operator przypisania, oraz metody: wyprowadzającą tablicę na ekran, wyznaczającą wartości minimalną i maksy- malną, sortującą tablicę,
b) wykorzystać powyższą klasę i stosując mechanizm dziedziczenia napisać definicję klasy tabli- ca2D, która będzie miała takie same metody operujące na tablicy dwuwymiarowej, przy czym sortowanie oraz szukanie minimum i maksimum wykonać dla każdego wiersza osobno, a wynik zwrócić jako tablicę wartości,
c) wykorzystując klasy tablica1D oraz tablica2D zrobić to samo co w punkcie b), tylko dla tabli- cy trójwymiarowej (sortowanie i szukanie min/max zrealizować w odniesieniu do pierwszego wymiaru tablicy).
6. * Wykorzystując wyniki podpunktu a) zadania 5 napisać klasę reprezentującą uogólnioną tablicę dynamiczną n-wymiarową (liczba wymiarów tablicy także ma być dobierana dynamicznie). Funkcje szukania ekstremów oraz sortowania skonstruować w taki sposób, aby możliwe było ich zastosowanie do dowolnie wybranego wymiaru.
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