[ Pobierz całość w formacie PDF ]

50: int itsTop;
51: int itsLeft;
52: int itsBottom;
53: int itsRight;
54: };
55: // koniec Rect.h
Listing 10.8. Rect.cpp
1: // pocz tek rect.cpp
2: #include "rect.h"
3: Rectangle::Rectangle(int top, int left, int bottom, int right)
Klasy, których danymi sk adowymi s inne klasy 337
4: {
5: itsTop = top;
6: itsLeft = left;
7: itsBottom = bottom;
8: itsRight = right;
9:
10: itsUpperLeft.SetX(left);
11: itsUpperLeft.SetY(top);
12:
13: itsUpperRight.SetX(right);
14: itsUpperRight.SetY(top);
15:
16: itsLowerLeft.SetX(left);
17: itsLowerLeft.SetY(bottom);
18:
19: itsLowerRight.SetX(right);
20: itsLowerRight.SetY(bottom);
21: }
22:
23:
24: // oblicza obszar prostok ta przez obliczenie
25: // i pomno enie szeroko ci i wysoko ci
26: int Rectangle::GetArea() const
27: {
28: int Width = itsRight-itsLeft;
29: int Height = itsTop - itsBottom;
30: return (Width * Height);
31: }
32:
33: int main()
34: {
35: //inicjalizuje lokaln zmienn typu Rectangle
36: Rectangle MyRectangle (100, 20, 50, 80 );
37:
38: int Area = MyRectangle.GetArea();
39:
40: std::cout
41: std::cout
42: std::cout
43: return 0;
44: }
Wynik
Obszar: 3000
Wsp. X lewego górnego rogu: 20
338 Lekcja 10. Klasy i obiekty
Analiza
Linie od 3. do 14. listingu 10.7 deklaruj klas Point (punkt), która s u y do
przechowywania wspó rz dnych x i y okre lonego punktu rysunku. W tym
programie nie wykorzystujemy nale ycie klasy Point. Jej zastosowania wymagaj
jednak inne metody rysunkowe.
Gdy nadasz klasie nazw Rectangle, niektóre kompilatory zg osz b d. Wynika
to z istnienia wewn trznej klasy o nazwie Rectangle. W takim przypadku po prostu
zmie nazw klasy na myRectangle.
W deklaracji klasy Point, w liniach 12. i 13., zadeklarowali my dwie zmienne
sk adowe (itsX oraz itsY). Te zmienne przechowuj wspó rz dne punktu.
Zak adamy, e wspó rz dna x ro nie w prawo, a wspó rz dna y w gór . Istniej
tak e inne systemy. W niektórych programach okienkowych wspó rz dna y ro nie
 w dó  okna.
Klasa Point u ywa akcesorów inline, zwracaj cych i ustawiaj cych wspó rz dne
X i Y punktu. Te akcesory zosta y zadeklarowane w liniach od 7. do 10. Punkty
u ywaj konstruktora i destruktora domy lnego. W zwi zku z tym ich wspó rz dne
trzeba ustawia jawnie.
Linia 17. rozpoczyna deklaracj klasy Rectangle (prostok t). Klasa ta sk ada si
z czterech punktów reprezentuj cych cztery naro niki prostok ta. Konstruktor klasy
Rectangle (linia 20.) otrzymuje cztery warto ci ca kowite, top (górna), left (lewa),
bottom (dolna) oraz right (prawa). Do czterech zmiennych sk adowych (listing
10.8) kopiowane s cztery parametry konstruktora i tworzone s cztery punkty.
Oprócz standardowych akcesorów, klasa Rectangle posiada funkcj GetArea()
(pobierz obszar), zadeklarowan w linii 43. Zamiast przechowywa obszar
w zmiennej, funkcja GetArea() oblicza go w liniach od 28. do 30. listingu 10.8.
W tym celu oblicza szeroko i wysoko prostok ta, nast pnie mno y je przez siebie.
Uzyskanie wspó rz dnej x lewego górnego wierzcho ka prostok ta wymaga
dost pu do punktu UpperLeft (lewy górny) i zapytania o jego wspó rz dn X.
Poniewa funkcja GetUpperLeft() jest funkcj klasy Rectangle, mo e ona
bezpo rednio odwo ywa si do prywatnych danych tej klasy, w cznie ze zmienn
(itsUpperLeft). Poniewa itsUpperLeft jest obiektem klasy Point, a zmienna
itsX tej klasy jest prywatna, funkcja GetUpperLeft() nie mo e odwo ywa si
do niej bezpo rednio. Zamiast tego, w celu uzyskania tej warto ci musi u y
publicznego akcesora GetX().
Klasy, których danymi sk adowymi s inne klasy 339
Linia 33. listingu 10.8 stanowi pocz tek cia a programu. Pami nie jest alokowana
a do linii 36.; w obszarze tym nic si nie dzieje. Jedyna rzecz, jak zrobili my,
to poinformowanie kompilatora, jak ma stworzy punkt i prostok t (gdyby
by y potrzebne w przysz o ci). W linii 36. definiujemy obiekt typu Rectangle,
przekazuj c mu warto ci top, left, bottom oraz right.
W linii 38. tworzymy lokaln zmienn Area (obszar) typu int. Ta zmienna
przechowuje obszar stworzonego przez nas prostok ta. Zmienn Area inicjalizujemy
za pomoc warto ci zwróconej przez funkcj GetArea() klasy Rectangle. Klient
klasy Rectangle mo e stworzy obiekt tej klasy i uzyska jego obszar, nie znaj c
nawet implementacji funkcji GetArea().
Plik Rect.h zosta przedstawiony na listingu 10.7. Obserwuj c plik nag ówkowy,
który zawiera deklaracj klasy Rectangle, programista mo e wysnu wniosek,
e funkcja GetArea() zwraca warto typu int. Sposób, w jaki funkcja GetArea()
uzyskuje t warto , nie interesuje klientów klasy Rectangle. Autor klasy Rectangle
móg by zmieni funkcj GetArea(); nie wp yn oby to na programy, które z niej
korzystaj , o ile warto ci zwrotn nadal by aby liczba ca kowita.
Linia 42. listingu 10.8 mo e wydawa si nieco dziwna, ale je li zastanowisz si nad
tym, co tam si dzieje, powinna sta si jasna. W tej linii kodu nast puje pobranie
wspó rz dnej x lewego górnego punktu prostok ta. Wzgl dem prostok ta
wywo ywana jest metoda GetUpperLeft(), która zwraca obiekt typu Point.
Z tego obiektu potrzebujemy wspó rz dnej x. Wcze niej dowiedzia e si ,
e akcesorem dla punktu x klasy Point jest GetX(). Dlatego te w celu pobrania
wspó rz dnej x lewego górnego naro nika prostok ta nale y u y akcesora GetX()
wzgl dem funkcji akcesora GetUpperLeft() obiektu MyRectangle. To w a nie
przedstawiono w linii 42.:
MyRectangle.GetUpperLeft().GetX();
Cz sto zadawane pytanie
Jaka jest ró nica pomi dzy deklaracj a definicj ?
Odpowied
Deklaracja wprowadza now nazw , lecz nie alokuje pami ci; dokonuje tego definicja.
Wszystkie deklaracje (z kilkoma wyj tkami) s tak e definicjami. Najwa niejszym
wyj tkiem jest deklaracja funkcji globalnej (prototyp) oraz deklaracja klasy (zwykle
w pliku nag ówkowym).
340 Lekcja 10. Klasy i obiekty
Struktury
Bardzo bliskim kuzynem s owa kluczowego class jest s owo kluczowe struct,
u ywane do deklarowania struktur. W C++ struktura jest odpowiednikiem klasy,
ale wszystkie jej sk adowe s domy lnie publiczne. Mo esz zadeklarowa struktur
dok adnie tak, jak klas ; mo esz zastosowa w niej te same zmienne i funkcje
sk adowe. Gdy przestrzegasz jawnego deklarowania publicznych i prywatnych
sekcji klasy, nie ma adnej ró nicy pomi dzy klas a struktur . Spróbuj wprowadzi
do listingu 10.7 nast puj ce zmiany:
w linii 3., zmie class Point na struct Point,
w linii 17., zmie class Rectangle na struct Rectangle.
Nast pnie skompiluj i uruchom program. Otrzymane wyniki nie powinny si od
siebie ró ni .
Prawdopodobnie zastanawiasz si , dlaczego dwa s owa kluczowe spe niaj t
sam funkcj . Przyczyn nale y szuka w historii j zyka. J zyk C++ powstawa
jako rozszerzenie j zyka C. J zyk C posiada struktury, ale nie posiadaj one metod.
Bjarne Stroustrup, twórca j zyka C++, rozbudowa struktury, ale zmieni ich nazw
na klasy, odzwierciedlaj c w ten sposób ich nowe, rozszerzone mo liwo ci oraz
zmian w domy lnej dost pno ci elementów sk adowych. To pozwala równie
na u ywanie w programach C++ ogromnej biblioteki funkcji j zyka C.
Tak Nie
Umieszczaj deklaracj klasy w pliku Nie przechod dalej, zanim dok adnie [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • odszkodowanie.xlx.pl
  • © 2009 ...coś się w niej zmieniło, zmieniło i zmieniało nadal. - Ceske - Sjezdovky .cz. Design downloaded from free website templates