Zaawansowane CPP/Ćwiczenia 7: Klasy wytycznych
Mechanizm wytycznych przydatny jest zwłaszcza podczas implementowania bibliotek. Pozwala definiować klasy, których pewne aspekty zachowania można ustalić (albo zmodyfikować) dopiero w momencie ich użycia w głównym programie.
W pliku word.cpp
znajduje się fragment kodu, mogącego przy dużej
dozie dobrej woli być uznanym za zalążek procesora tekstu.
Przyjęto w nim założenie, że dokument składa się z akapitów, a każdy
akapit będzie przechowywany jako jeden długi łańcuch.
Aby wyświetlić dokument na ekranie, trzeba połamać akapity na poszczególne
wiersze nie przekraczające jego szerokości.
Istnieją różne algorytmy dokonujące łamania.
Mogą one np. wyrównywać linie do prawej dodając na ich początek odpowiednią
liczbę spacji, justować poprzez wstawianie spacji w środek, dbać o zachowanie
zasad polskiej typografii poprzez pilnowanie aby spójniki nie trafiały
na koniec linii, itd.
Zadanie 1
Przestudiuj kod w pliku word.cpp
; przy okazji upewnij się czy
zamieszczony tam algorytm banalnego łamania wierszy jest poprawny
(sprawdź zwłaszcza przypadki krańcowe i błędy off-by-one).
Zaimplementuj dodatkową klasę wytycznych z innym algorytmem łamania
linii, stwórz wewnątrz main()
taki dokument i go wydrukuj.
Zadanie 2 Zaimplementuj odpowiedni operator, który pozwoli na przypisanie z jednego dokumentu do drugiego. Pamiętaj że dokumenty zostały skonkretyzowane z innymi wytycznymi, a więc dla kompilatora będą to dwie różne klasy.
Zadanie 3
Przeanalizuj przykład zaczynający się od pliku glowny.cpp
.
Zamienia on nazwy zrozumiałe dla człowieka ("czarny", "zielony")
na strukturki ze składowymi RGB, wykorzystując do tego celu fabrykę kolorów.
Domyślną reakcją fabryki na przekazanie nieznanej nazwy koloru powinno
być rzucenie wyjątkiem, ale chcemy zachować możliwość zmiany tej
defaultowej reakcji; wprowadzono więc klasę wytycznych.
Zwróć uwagę na podział tego projektu na poszczególne pliki źródłowe.
Zaimplementuj w odrębnym pliku (albo plikach) alternatywną politykę,
która zamiast wyjątku zwraca pewien ustalony kolor domyślny.
Przerób ją następnie z klasy na szablon klasy, tak aby można było
zadawać kolor domyślny jako trzy parametry tego szablonu.