[ Pobierz całość w formacie PDF ]

że program zostanie wykonany wielokrotnie bez wykonania wszystkich istniejących ścieżek
wykonania kodu. Dlatego błąd czasu działania może przez dłuższy czas pozostać niezauwa-
żony. Bł dy kompilacji są wykrywane podczas każdej kompilacji, są wi c dużo łatwiejsze do
zidentyfikowania i poprawienia. Celem dobrego programowania jest ochrona przed pojawia-
niem si bł dów czasu działania. Jedną ze znanych i sprawdzonych technik jest wykorzy-
stanie kompilatora do wykrycia pomyłek już na wczesnym etapie tworzenia programu.
150 Część I
Gdzie umieszczać deklaracje klasy
i definicje metod
Każda funkcja, którą zadeklarujesz dla klasy, musi posiadać definicj. Definicja jest
nazywana także implementacją funkcji. Podobnie jak w przypadku innych funkcji,
definicja metody klasy posiada nagłówek i ciało.
Definicja musi znajdować si w pliku, który może zostać znaleziony przez kompila-
tor. Wikszość kompilatorów C++ wymaga, by taki plik miał rozszerzenie .c lub .cpp.
W tej książce korzystamy z rozszerzenia .cpp, ale aby mieć pewność, sprawdz, czego
oczekuje twój kompilator.
Wiele kompilatorów zakłada, że pliki z rozszerzeniem .c są programami C, zaś
pliki z rozszerzeniem .cpp są programami C++. Możesz używać dowolnego
rozszerzenia, ale rozszerzenie .cpp wyeliminuje ewentualne nieporozumienia.
W pliku, w którym umieszczasz implementacj funkcji, możesz umieścić również jej
deklaracj, ale nie należy to do dobrych obyczajów. Zgodnie z konwencją zaadopto-
waną przez wikszość programistów, deklaracje umieszcza si w tak zwanych plikach
nagłówkowych, zwykle posiadających t samą nazw, lecz z rozszerzeniem .h, .hp
lub .hpp. W tej książce dla plików nagłówkowych stosujemy rozszerzenie .hpp, ale
sprawdz w swoim kompilatorze, jakie rozszerzenie powinieneś stosować.
Na przykład, deklaracj klasy powinieneś umieścić w pliku o nazwie CAT.hpp,
zaś definicj metod tej klasy w pliku o nazwie CAT.cpp. Nastpnie powinieneś dołą-
czyć do pliku .cpp plik nagłówkowy, poprzez umieszczenie na początku pliku
CAT.cpp nastpującej dyrektywy:
Informuje ona kompilator, by wstawił w tym miejscu zawartość pliku CAT.hpp tak, jak-
byś ją wpisał rcznie. Uwaga: niektóre kompilatory nalegają, by wielkość liter w nazwie
pliku w dyrektywie zgadzała si z wielkością liter w nazwie pliku na dysku.
Deklaracja klasy mówi kompilatorowi, czym jest ta klasa, jakie dane zawiera
oraz jakie funkcje posiada. Deklaracja klasy jest nazywana jej interfejsem, gdyż
informuje kompilator w jaki sposób ma z nią współdziałać. Ten interfejs jest
zwykle przechowywany w pliku .hpp, cz sto nazywanym plikiem nagłówkowym.
Definicja funkcji mówi kompilatorowi, jak działa dana funkcja. Definicja funkcji
jest nazywana implementacją metody klasy i jest przechowywana w pliku .cpp.
Szczegóły dotyczące implementacji klasy należą wyłącznie do jej autora. Klien-
ty klasy  tj. cz ści programu używające tej klasy  nie muszą, ani nie po-
winny wiedzieć, jak zaimplementowane zostały funkcje.
Rozdział 6. f& Programowanie zorientowane obiektowo 151
f&
f&
f&
Dlaczego masz si trudzić, rozdzielając program na pliki .hpp i .cpp, skoro i tak plik
.hpp jest wstawiany do pliku .cpp? W wikszości przypadków klienty klasy nie dbają
o szczegóły jej implementacji. Odczytanie pliku nagłówkowego daje im wystarczają-
cą ilość informacji, by zignorować plik implementacji. Poza tym, ten sam plik .hpp
możesz dołączać do wielu różnych plików .cpp.
Implementacja inline
Możesz poprosić kompilator, by uczynił zwykłą funkcj funkcją , funkcjami
mogą stać si również metody klasy. W tym celu należy umieścić słowo klu-
czowe przed typem zwracanej wartości. Na przykład, implementacja
funkcji wygląda nastpująco:
Definicj funkcji można także umieścić w deklaracji klasy, co automatycznie sprawia,
że ta funkcja staje si funkcją . Na przykład:
Zwróć uwag na składni definicji funkcji . Ciało funkcji zaczyna
si natychmiast po deklaracji metody klasy; po nawiasach nie wystpuje średnik. Po-
dobnie jak w innych funkcjach, definicja zaczyna si od otwierającego nawiasu klam-
rowego i kończy zamykającym nawiasem klamrowym. Jak zwykle, białe spacje nie
mają znaczenia; możesz zapisać t deklaracj jako:
Listingi 6.6 i 6.7 odtwarzają klas , tym razem jednak deklaracja klasy została
umieszczona w pliku CAT.hpp, zaś jej definicja w pliku CAT.cpp. Oprócz tego, na li-
stingu 6.7 akcesor został zadeklarowany jako funkcja .
152 Część I
Listing 6.6. Deklaracja klasy Cat w pliku CAT.hpp
Listing 6.7. Implementacja klasy Cat w pliku CAT.cpp
Kod zaprezentowany na listingach 6.6 i 6.7 jest podobny do kodu z listingu 6.4, trzy
metody zostały zadeklarowane w pliku deklaracji jako , a deklaracja została
przeniesiona do pliku CAT.hpp (listing 6.6).
Rozdział 6. f& Programowanie zorientowane obiektowo 153
f&
f&
f&
Funkcja jest deklarowana w linii 6., gdzie znajduje si także jej implemen-
tacja. Linie 7. i 8. zawierają kolejne funkcje , jednak w stosunku do poprzed-
nich,  zwykłych implementacji, działanie tych funkcji nie zmienia si.
Linia 4. listingu 6.7 zawiera dyrektyw , która powoduje wsta-
wienie do pliku zawartości pliku CAT.hpp. Dołączając plik CAT.hpp, informujesz
prekompilator, by odczytał zawartość tego pliku i wstawił ją w miejscu wystąpienia
dyrektywy (tak jakbyś, począwszy od linii 5, sam wpisał t zawartość).
Ta technika umożliwia umieszczenie deklaracji w pliku innym niż implementacja,
a jednocześnie zapewnienie kompilatorowi dostpu do niej. W programach C++ tech-
nika ta jest powszechnie wykorzystywana. Zwykle deklaracje klas znajdują si w pli-
kach .hpp, które są dołączane do powiązanych z nimi plików .cpp za pomocą dyrek-
tyw .
Linie od 18. do 29. stanowią powtórzenie funkcji z listingu 6.4. Oznacza to, że
funkcje działają tak samo jak zwykłe funkcje.
Klasy, których danymi składowymi
s inne klasy
Budowanie złożonych klas przez deklarowanie prostszych klas i dołączanie ich do
deklaracji bardziej skomplikowanej klasy nie jest niczym niezwykłym. Na przykład, [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • juli.keep.pl