Informatyka 3 Laboratorium 3.
Dziedziczenie / Funkcje Zaprzyjaznione
Informatyka 3 / Projektowanie Obiektowe
Politechnika Wrocławska MVLAB
Autorzy: mgr inż. Mariusz Mrzygłód
mgr inż. Wojciech Cieszyński
Informacje ogólne
Programowanie obiektowe, język: C++;
Åšrodowisko pracy: Microsoft Visual Studio 2005;
Środowisko na potrzeby pracy poza zajęciami można pobrać:
·ð z kont studenckich MSDN AA dla Wydz. Mechanicznego PWr,
·ð w darmowej wersji udostÄ™pnianej przez producenta: Visual Studio 2005 Express.
Literatura:
·ð J. Liberty, "C++ dla każdego", Helion 2002,
·ð B. Stroustrup, "JÄ™zyk C++", WNT 2002,
·ð J.GrÄ™bosz, "Symfonia C++", Editions 2000 rok 2006,
·ð B. Eckel, "Thinking in C++ Edycja polska", Helion 2002,
·ð http://pl.wikibooks.org/wiki/C++.
1
Informatyka 3 Laboratorium 3.
Dziedziczenie.
Dziedziczenie umożliwia tworzenie nowych klas na podstawie już istniejących z możliwością
dodawania kolejnych funkcjonalności metod i atrybutów.
Z utworzonej na poprzednich zajęciach klasy CLiczba wyprowadzimy pochodną klasę będącą
reprezentacjÄ… walutowego zapisu liczb.
Utwórz pochodną klasę CWaluta dziedziczącą zmienne i metody po klasie CLiczba.
Wykorzystaj do tego celu kreator klas, w którym zdefiniuj dla klasy CWaluta klasę bazową.
Przejdz do pliku nagłówkowego dziedziczącej klasy CWaluta i przeanalizuj jej definicję.
#include "CLiczba.h" // dołączenie biblioteki klasy CLiczba
class CWaluta : // klasa CWaluta
public CLiczba // typu klasy CLiczba
{
public:
CWaluta(void);
~CWaluta(void);
};
Klasa CWaluta.
Wartość walutowa składa się z wartości liczbowej oraz przyrostka trzyznakowego określającego
rodzaj waluty np.: PLN, USD, EUR, JPY. Utworzona klasa CLiczba posiada zapis liczb w postaci tablicy
znaków string (tablica char). Aby utworzyć zapis walutowy koniecznym jest, aby uzupełnić
funkcjonalność klasy CLiczba, tak aby wyświetlać wartość razem z przyrostkiem walutowym.
Dodatkowo, aby umożliwić operacje dodawania itp. na dwóch różnych walutach musimy
zaimplementować przelicznik walutowy w postaci zmiennej double.
2
Informatyka 3 Laboratorium 3.
Dla klasy CWaluta utwórz dwie prywatne zmienne:
double m_fPrzelicznik;
char m_csWaluta[4];
Akcesory klasy CWaluta.
Utwórz wskazane akcesory dla klasy CWaluta:
UstawWalute() metoda ta ma za zadanie wpisać rodzaj waluty dla naszego obiektu
UstawPrzelicznik() metoda ta ma za zadanie wpisać przelicznik waluty dla naszego obiektu
DajWalute() metoda ta ma za zadanie zwrócić rodzaj waluty dla naszego obiektu
DajPrzelicznik() metoda ta ma za zadanie zwrócić przelicznik waluty dla naszego obiektu
void UstawWalute(const char *waluta);
bool UstawPrzelicznik(double przelicznik) ;
Zadanie.
Zdefiniuj metody DajWalute() i DajPrzelicznik() jako funkcje inline, tak aby nie modyfikowały
zawartości obiektu (const).
Zadanie.
Zdefiniować działanie metody UstawWalute() tak aby wpisywała do obiektu rodzaj waluty.
Zadanie.
Zdefiniować działanie metody UstawPrzelicznik() tak aby wpisywała do obiektu wartość przelicznika
sprawdzając czy jego wartość jest większa od zera.
3
Informatyka 3 Laboratorium 3.
Protected, Private
Dla poszczególnych zmiennych I funkcji możemy dokładnie określić czy mają one działać (być
dostępne) wyłącznie w obrębie tej jednej klasy, czy także w klasach pochodnych. Do tych celów służą
słowa kluczowe public, private i protected.
private nadaje zmiennej lub metodzie atrybut dostępu jedynie wewnątrz danej klasy.
protected nadaje zmiennej lub metodzie atrybut dostępu wewnątrz danej klasy jak i pochodnych.
Dotychczas zmienne m_fWartosc, m_iPrecyzja oraz m_cdWartoscString w klasie CLiczba określiliśmy
jako zmienne prywatne celem zabezpieczenia ich przed wpisaniem nieprawidłowych wartości.
Tym samym jednak uniemożliwiliśmy dostęp do nich klasom pochodnym. Aby to naprawić
koniecznym jest zdefiniowanie tych zmiennych jako chronione (protected).
Dzięki zastosowaniu zmiennych chronionych będziemy teraz mogli używać ich w klasie pochodnej
CWaluta.
Zadanie.
W pliku nagłówkowym klasy CLiczba zmień definicję zmiennych m-fWartosc, m-iPrecyzja oraz m-
cdWartoscString na chronione (protected).
Wirtualna metoda AktualizujString().
Zdefiniowana metoda klasy CLiczba AktualizujString() przepisuje wartość liczby do postaci string. W
przypadku waluty, jej reprezentacja znakowa musi zawierać przyrostek rodzaju waluty np. PLN.
Dlatego musimy przedefiniować działanie tej metody dla klasy CWaluta.
Zadanie.
Utwórz metodę dla klasy CWaluta o nazwie AktualizujString() analogicznie do tej zdefiniowanej w
klasie CLiczba.
4
Informatyka 3 Laboratorium 3.
Działanie metody AktualizujString() klasy CWaluta jest podobne jak dla klasy CLiczba za wyjątkiem
wpisywania wartości do zmiennej buf. W tym miejscu dodajemy funkcjonalność, która zapewni nam
podanie rodzaju waluty:
void CWaluta::AktualizujString(void)
{
char buf[100];
sprintf(buf,"%.*lf %s",m_iPrecyzja,m_fWartosc, m_csWaluta);
// dodajemy rodzaj waluty poprzez zmiennÄ… m_csWaluta
if(m_csWartoscString!=NULL) delete [] m_csWartoscString;
m_csWartoscString=new char[strlen(buf)+1];
strcpy(m_csWartoscString,buf);
}
Zadanie.
Utwórz obiekt klasy CWaluta z zadaną wartością i precyzją; wywołaj metodę UstawWartosc(10),
wywołał metodę Drukuj(), a następnie przeanalizuj działanie programu. Dlaczego wyświetlana
wartość nie posiada przyrostka ?
Przykład realizacji:
CWaluta StanKonta;
StanKonta.UstawWalute("PLN");
StanKonta.Drukuj();
StanKonta.Wartosc(15.5);
StanKonta.Drukuj();
Metody UstawWartosc() oraz UstawPrecyzje() korzystajÄ… tutaj z metody AktualizujString() klasy
nadrzędnej (bazowej) CLiczba. Dzieję się tak dlatego, że kompilator nie wie, że metoda ta została w
pochodnej klasie zmodyfikowana. Aby zwrócić kompilatorowi uwagę, żeby korzystał w tym
przypadku z definicji metody AktualizujString() utworzonej w klasie CWaluta musimy określić ją jako
metodę wirtualną już w klasie bazowej. Oznaczenie funkcji jako wirtualnej powoduje iż metoda
AktualizujString() klasy CWaluta przykrywa metodę AktualizujString() z klasy nadrzędnej inaczej,
wskazuje kompilatorowi, że w nowo utworzonej klasie znajduje się ta sama metoda o rozszerzonej
funkcjonalności.
virtual void AktualizujString(void);
Zadanie.
Sprawdz działanie metody wirtualnej AktualizujString().
Sekwencja zadan
5
Informatyka 3 Laboratorium 3.
Zadanie.
Z której definicji destruktora korzysta klasa CWaluta ? (z dziedziczonego, własnego czy obu)
Czy destruktor może być metodą wirtualną ?
Konstruktor dla klasy CWaluta.
Aby utworzyć wartość walutową musimy podać jej wartość, przelicznik walut jak i walutę, co oznacza,
że utworzyć musimy obiekt ze ściśle określonymi właściwościami. Do tego celu koniecznym jest
wpierw zdefiniowanie konstruktora klasy CWaluta.
Konstruktor domyślny.
CWaluta(void);
Domyślny konstruktor utworzony przy zadeklarowaniu klasy nie pobiera parametrów. Różnić się on
musi od konstruktora klasy CLiczba tym, że powinien mieć określone wartości przelicznika waluty,
rodzaju waluty, a także jak to miało miejsce w przypadku konstruktora klasy CLiczba wartość i
precyzjÄ™.
Obiekty klas dziedziczonych podczas ich tworzenia wywołują zarówno własny konstruktor , jak i
konstruktor klasy nadrzędnej (bazowej). Istnieje jednak możliwość, aby określić, który z
konstruktorów klasy nadrzędnej chcemy wywołać. Wybrany konstruktor musimy wywołać wtedy w
liście inicjalizującej klasy pochodnej (wyprowadzonej).
CWaluta::CWaluta(void)
: CLiczba(0,2)
//wywołanie określonego konstruktora klasy nadrzędnej
, m_fPrzelicznik(1.0)
//nadanie domyślnej wartości przelicznika
{
strcpy(m_csWaluta,"PLN");
//nadanie domyślnego rodzaju waluty
AktualizujString();
}
Zadanie.
Utwórz konstruktor przeciążony dla klasy CWaluta, którego parametrami będą rodzaj waluty,
przelicznik oraz wartość i precyzja. Użyj parametrów do wywołania odpowiedniego konstruktora
klasy nadrzędnej oraz odpowiednich metod klasy.
6
Informatyka 3 Laboratorium 3.
Konstruktor kopiujÄ…cy klasy CWaluta.
CWaluta(CWaluta &Wal);
Aby utworzyć konstruktor kopiujący wystarczy za pomocą wartości zdefiniowanych w obiekcie
kopiowanym, ustawić wszystkie wartości w nowo tworzonym obiekcie oraz zaktualizować wszystkie
zmienne zależne.
CWaluta::CWaluta(CWaluta &Wal)
: CLiczba(Wal.m_fWartosc,Wal.m_iPrecyzja)
, m_fPrzelicznik(1.0)
{
UstawPrzelicznik(Wal.m_fPrzelicznik);
UstawWalute(Wal.m_csWaluta);
}
Zadanie.
Dlaczego w konstruktorach kopiujących używa się referencji do kopiowanego obiektu? Jaka jest
różnica pomiędzy przekazywaniem do konstruktora referencji do obiektu, a przekazywaniem
wskaznika do obiektu ?
Zadanie domowe.
W każdej funkcji dopisz do definicji wyświetlenie na ekranie napisu np. Wywołano Konstruktor
przeciążony z parametrem Wartość . Uruchom program i przeanalizuj w jakiej kolejności są
wywoływane funkcje w programie. Przeanalizuj, które i w jakiej kolejności wywoływane są
konstruktory i destruktory.
7
Informatyka 3 Laboratorium 3.
Funkcje zaprzyjaznione.
Funkcja zaprzyjazniona to zewnętrzna funkcja (zdefiniowana poza klasą), która ma dostęp do
prywatnych i chronionych składników klasy.
Aby utworzyć funkcję zaprzyjaznioną koniecznym jest, aby zapisać w pliku nagłówkowym klasy, że
taka funkcja zaistnieje i będzie korzystała z jej zmiennych lub metod. Do tych celów wykorzystuje się
słówko kluczowe friend.
friend void WyswietlWartosc(CWaluta &Kwota);
Ciało funkcji zaprzyjaznionej definiujemy poza klasą, np. w pliku z funkcją main().
Przyjmijmy, że metoda Drukuj() jest metodą prywatną.
void WyswietlWartosc(CWaluta &Kwota) //bez znacznika CWaluta::
{
Kwota.Drukuj();
}
Właściwości funkcji zaprzyjaznionych.
1) nie jest ważne w którym miejscu klasy (private, protected, public) zostanie przyjazń
zadeklarowana. Przyjaznie danej klasy są stosunkowo ważne z punktu widzenia projektanta,
stąd też deklaracje przyjazni zaleca się deklarować na samym początku deklaracji klasy.
2) przyjazń nie jest dziedziczona.
3) funkcja może być przyjacielem wielu klas.
4) funkcją zaprzyjaznioną może być zarówno funkcja globalna, jak i funkcja składowa innej klasy.
Zadanie domowe.
Utwórz funkcję zaprzyjaznioną z klasą CWaluta, która wypisze na ekranie przeliczoną wartość waluty.
Podpowiedz:
return obiekt.m_fWartosc * obiekt.m_fPrzelicznik;
8
Wyszukiwarka
Podobne podstrony:
studentcanpoststudentTemat 3 Z3 wsp klikcm0procwyklad z analizy matematycznej dla studentow na kierunku automatyka i robotyka aghapril 09 uppersecondary studentscw16 krata student3? EXAM LANGUAGE ELEMENTSfor studentsstudent10 2niezbednik studenta cz 2Dla studentów administracjinotatek pl materiały dla studentów (repetytorium) sem1student wniosek osw dochodystudentekZ3więcej podobnych podstron