Szablony
Szablon funkcji
template <class Typek> Typek& pewna_funkcja(Typek x) { return x; }
Szablon klasy
template <class Typek> class Klasa { Typek *x; void Metoda(); }
Szablon funkcji składowej (metody)
template <class Typek> void Klasa<Typek>::Metoda() { }
Wzorzec klasy Wektor
Zaimplementuj szablon klasy Wektor
, który w dynamicznie przydzielonej tablicy o określonym rozmiarze, przechowuje elementy dowolnego typu. Klasa ta powinna implementować następujące metody:
- konstruktor domyślny, inicjuje Wektor o pojemności 20 elementów.
- konstruktor
Wektor(int rozmiar)
inicjuje wektor o podanej pojemności - operator
[]
pozwalający odwołać się do konkretnego elementu wektora IleElementow
zwraca ilość elementów (nie pojemność wektora)Rozmiar
podaje pojemność wektoraDodaj
umieszcza element na końcu wektora (jeśli pojemność wektora jest za mała należy ją zwiększyć, np. dwukrotnie).Usun
usuwa ostatni element wektora.Wyczysc
usuwa wszystkie elementy z wektora- destruktor
Przykładowy kod testujący klasę:
Wektor<int> liczby; for(int i=0;i<100;i++) liczby.Dodaj(i); cout << "Rozmiar " << liczby.Rozmiar() << " elementow " << liczby.IleElementow() << endl; float wsp[]={1,2,3,4,5}; Wielomian w1(wsp,4); Wektor<Wielomian> wektor_wielomianow; for(int i=0;i<100;i++) { Wielomian w2=w1 * liczby[i]; wektor_wielomianow.Dodaj(w*i); } cout << "Wyswietlam pewien wielomian : " << wektor_wielomianow[5] << endl;
Zadania dodatkowe
Dodaj do klasy Wektor:
- konstruktor kopiujący
- przeciążoną metodę
Dodaj
pozwalającą dodać element na dowolnej pozycji (od 0 doile_elemntow
). - przeciążoną
Usun
usuwającą element z wybranej pozycji. Metoda powinna zwracać usuwany element. - dociąż operator « wypisujący zawartość wektora do strumienia (zakładamy, że dla typu składowego wektora istnieje dociążony odpowiednio operator «)
Iterator
Dodaj do klasy Wektor:
- iterator o swobodnym dostępie (random access iterator)
- metody begin() i end() zwracające iterator (bezpośredniego dostępu) pokazujący odpowiednio na pierwszy element oraz na pozycję za ostatnim elementem.
W tym przypadku iterator swobodnego dostępu będzie po prostu wskaźnikiem typu T*. Wystarczy więc przezwać ten typ używając polecenia
typedef
.
Przykładowe użycie:
Wektor<int> wektor; for(int i=0 ; i<100 ; i++) wektor.Dodaj(i); Wektor<int>::iterator it; for(it=wektor.begin() ; it!=wektor.end() ; it++) cout << *it << endl;