|
|
pl:dydaktyka:jimp2:2016:part2:ex:ex3 [2016/05/02 23:40] msl |
pl:dydaktyka:jimp2:2016:part2:ex:ex3 [2019/06/27 15:50] |
===== Przebieg ćwiczenia ===== | |
| |
- Definiujemy szablon klasy bazowej (**''aghContainer''**), od której będą się wywodzić pozostałe klasy pojemnikowe | |
- Klasa bazowa **nie może** posiadać **żadnych** pól składowych ponieważ w klasach pochodnych sposób gromadzenia i przechowywania danych może być **różny** (porównaj: wektor, lista, stos, drzewo). | |
- Indeksowanie elementów rozpoczynamy od **zera**. | |
- **Obowiązkowe** metody jakie **muszą** znaleść się w definicji szablonu klasy **podstawowej** to: | |
* Metodę dodawania elementu do pojemnika: | |
* <code cpp>void append(T const&);</code> dodająca podany jako argument obiekt typu **''T''** do pojemnika. | |
* Metoda wstawiania elementu do pojemnika: | |
* <code cpp>bool insert(int, T const&);</code> wstawiająca obiekt typu **''T''** w wybrane miejsce. Zwraca **''true''** jeżeli podane miejsce wstawienia jest **prawidłowe**, w przeciwnym wypadku zwraca **''false''**. | |
* Metoda podmiany elementu w pojemniku: | |
* <code cpp>bool replace(int, T const&);</code> podmienia obiekt typu **''T''** z obiektem na wybranym miejscu. Zwraca **''true''** jeżeli podane miejsce podmiany jest **prawidłowe**, w przeciwnym wypadku zwraca **''false''**. | |
* Metoda zwracająca wartość elementu: | |
* <code cpp>T& at(int) const;</code> zwraca wartość w pojemniku. Zakładamy że indeksowanie wartości rozpoczynamy **od zera**. | |
* Metoda zwracająca ilość elementów: | |
* <code cpp>int size(void) const;</code> zwraca ilość elementów w pojemniku. | |
* Metoda usuwająca wybrany element: | |
* <code cpp>bool remove(int);</code> usuwa element na danym miejscu. Zwraca **''true''** jeżeli podane miejsce usunięcia jest **prawidłowe**, w przeciwnym wypadku zwraca **''false''**. | |
* Metoda opróżniająca pojemnik: | |
* <code cpp>void clear(void);</code> usuwa wszystkie elementy pojemnika. | |
* Metoda sprawdzająca czy pojemnik jest pusty: | |
* <code cpp>bool isEmpty(void);</code> zwraca **''true''** jeżeli pojemnik jest pusty, inaczej **''false''**. | |
* Metoda wyszukująca element w pojemniku przez wartość od zadanego momentu: | |
* <code cpp>int indexOf(T const& _value, int _from = 0) const;</code> wyszukuje i zwraca indeks pierwszego elementu o wartości ''_value'' zaczynając od elementu ''_from''. Jeżeli takiego elementu nie ma to zwraca ''-1''. | |
* Metoda sprawdzająca czy dany element jest już w pojemniku: | |
* <code cpp>bool contains(T const& _value, int _from = 0) const;</code> zwraca **''true''** jeżeli element o wartości ''_value'' znajduje się w pojemniku inaczej zwraca **''false''**. Wyszukiwanie rozpoczyna się od elelmetnu ''_from''. | |
* Oraz operatory: | |
* Operator przypisania. | |
* Operator porównania:<code cpp>bool operator==(aghContainer<T> const& right);</code> sprawdza czy zawartość pojemników jest taka sama. | |
* Operator nierówności:<code cpp>bool operator!=(aghContainer<T> const& right);</code> sprawdza czy zawartość pojemników jest różna. | |
* Operator ''[]'':<code cpp>T& operator[](int n) const;</code> zwraca element o indeksie ''n''. | |
* Operator ''+='':<code cpp>aghContainer<T>& operator+=(aghContainer<T> const& right);</code> dopisuje wszystkie elementy z pojemnika ''right'' i zwraca referencje do **''this''**. | |
* Operator ''+='':<code cpp>aghContainer<T>& operator+=(T const& element);</code> dodaje element do pojemnika i zwraca referencje do **''this''**. | |
* Operator ''<<'':<code cpp>aghContainer<T>& operator<<(T const& element);</code> dodaje element do pojemnika i zwraca referencje do **''this''**. | |
* Operator ''<<'':<code cpp>aghContainer<T>& operator<<(aghContainer<T> const& right);</code> dopisuje wszystkie elementy z pojemnika ''right'' i zwraca referencje do **''this''**. | |
* Operator ''<<'':<code cpp>ostream& operator<<(ostream&, aghContainer<T> const& right);</code> wypisuje zawartość pojemnika na strumień. | |
* Inne konieczne metody i/lub operatory wedle uznania. | |
- W klasie **abstrakcyjnej** (**''aghContainer''**) definiujemy **wszystkie** możliwe do zdefiniowania metody. Zaoszczędzi to sporo czasu w kolejnych ćwiczeniach przy tworzeniu klas pochodnych. Metody których ciało **nie** może zostać zdefiniowane w klasie abstrakcyjnej to: **destruktor**, **''remove''**, **''size''**, **''insert''**, **''at''**. Pozostałem metody definiujemy przy pomocy wyżej wymienionych. | |
- Budujemy klasę **''aghVector''**, która będzie **dziedziczyć** powyższą klasę abstrakcyjną w sposób **publiczny**. Klasa powinna obsługiwać **wszystkie** powyższe metody. <WRAP center round tip 60%> | |
Proszę stosować się do tzw. [[https://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29|reguły trzech]] | |
</WRAP> | |
| |
- Nie ma przymusu tworzenia metod czy też klas specjalizowanych. | |
- Rozmiar wektora powinien być zmieniany dynamicznie. | |
- Program powinien mieć budowę **modułową**. | |
- **Nie dublujemy** kodu, tzn. nie piszemy dwa i więcej razy kodu, który wykonuje podobne zadania - **ta kwestia będzie ważnym kryterium oceny jakości kodu**. | |
- Do realizacji ćwiczenia **nie można** wykorzystywać już gotowych rozwiązań (STL, boost, Qt, itp.). | |
- Zaistniałe nieprawidłowe sytuacje powinny zostać obsłużone poprzez wyrzucenie wyjątku przy pomocy klasy **''[[..:org:codepolicy#obsluga_wyjatkow|aghException]]''**. | |
- Program powinien się poprawnie kompilować i uruchomić wraz z dostarczonymi plikami z paczki {{:pl:dydaktyka:jimp2:2016:part2:ex:ex3.zip|}}. | |
| |
<WRAP center round tip 60%> | |
Plik ''catch.h'' jest to [[https://github.com/philsquared/Catch|jedna z najlepszych bibliotek do pisania testów kodu w C++]]. Plik ''ex3main.cpp'' korzysta z niej do testowania dostarczonych implementacji. | |
</WRAP> | |
| |