You are on page 1of 27

Veleuilite u Rijeci

C++
mr.sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Sadraj
Vezana lista objekata
Prijatelj klase
Nasljeivanje
Virtualne metode i polimorfizam
Apstraktne klase

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Vezana lista objekata


Postupak : smjestiti sve operacije (metode)
koje se odnose na rad s vezanom listom u istu
klasu s podacima koje sadri element vezane
liste (princip enkapsulacije):
metode pripadaju elementima liste
(objektima) samo logiki (ne optereuju
objekte)
klasa koja se odnosi na drugu vezanu listu
moe koristiti istoimene metode
upotreba pokazivaa this radi pristupa glavi
liste iz objekta

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Definiranje klase
class student{
private: student *slijedeci; //pokaziva na slijedei
element liste
public:
//javni atributi podatkovni sadraj elementa liste
int mat_br;
char prez_ime[35];
int god_stu;
//metode sve operacije za rad s vezanom listom
...
...
}; //class
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Alokacija glave liste i pokretanje konstruktora


class student{
...
//metode sve operacije za rad s vezanom listom
student(){ //konstruktor
slijedeci=NULL;
}; //konstruktor
...
}; //class
int main(){
lista=new student; //alokacija glave liste
} //main
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Metoda za dodavanje novog elementa listi


void dodaj_element(){ // dodaje element na kraj liste
student *novi,*zadnji;
zadnji = this; // this je glava liste
while (zadnji->slijedeci)
zadnji = zadnji->slijedeci; // pronalaenje zadnjeg
elementa
novi = new student;
// alokacija novog
elementa liste
zadnji -> slijedeci = novi;
// povezivanje zadnjeg
elementa s novim
cout << "Maticni broj: "; cin >> novi -> mat_br;
cout << "Prezime i ime: "; cin >> novi -> prez_ime;
cout << "Godina upisa studija: "; cin >> novi ->
god_upisa;
}; //dodaj_element
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Poziv metode:

Veleuilite u Rijeci

Metoda za ispis svih elemenata liste


void ispisi_sve_elemente(){ // ispis svih elemenata liste
student *tekuci = this -> slijedeci; // poetni element za
ispis
while (tekuci){
cout << "Maticni broj: " << tekuci -> mat_br << endl;
cout << "Prezime i ime: " << tekuci -> prez_ime <<
endl;
cout << "Godina upisa studija: " << tekuci ->
god_upisa << endl;
cout << "---------------------" << endl;
tekuci = tekuci -> slijedeci; // kretanje kroz listu
}; // while
}; //ispisi_sve_elemente
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Poziv metode:

Veleuilite u Rijeci

Metoda za pretraivanje liste


void pretrazi_listu(int mat_br){ //pretraivanje prema
matinom broju
int nadjen=0;
student *tekuci = this -> slijedeci;
while (tekuci){
if (tekuci -> mat_br == mat_br){
nadjen=1;
cout << "Maticni broj: " << tekuci -> mat_br <<
endl;
cout << "Prezime i ime: " << tekuci -> prez_ime <<
endl;
cout << "Godina upisa studija: " << tekuci ->
god_upisa << endl;
cout << "---------------------" << endl; break;}; //if
tekuci = tekuci -> slijedeci;}; // while
if (!nadjen) cout<<"Element nije pronadjen u
listi!"<<endl;
8
mr.11/12/16
sc.
Tomljanovi, vii predava
};Jasminka
//pretrazi_listu

Veleuilite u Rijeci

Metoda za brisanje liste

void brisi_element(int mat_br){int nadjen=0;


student *brisi = this -> slijedeci, *prethodni = this;
while (brisi){
if (brisi -> mat_br == mat_br){
nadjen=1;
prethodni -> slijedeci = brisi -> slijedeci;
delete brisi; break; // izlaz iz petlje
}; // if
prethodni = brisi;
brisi = brisi->slijedeci;
}; // while
if (nadjen) cout << "Element je izbrisan iz liste!" <<
endl;
else cout << "Element nije pronadjen!" << endl;
}; //brisi element
Poziv metode:
11/12/16
mr.lista->brisi_element(mat_br);
sc. Jasminka Tomljanovi, vii predava

Veleuilite u Rijeci

Metoda za sortiranje liste uzlazno prema matinom


broju

void sortiraj_listu(){
student *prethodni,*tekuci,*slijedeci;
int indikator,brojac=0;
do{ indikator = 0;
tekuci=this->slijedeci;prethodni=this;
while (tekuci->slijedeci){
slijedeci=tekuci->slijedeci;
if (tekuci->mat_br > slijedeci->mat_br){
prethodni->slijedeci=slijedeci;
tekuci->slijedeci=slijedeci->slijedeci;
slijedeci->slijedeci=tekuci;
indikator=1;} //if
prethodni=tekuci;
tekuci=tekuci->slijedeci;} //while
} while (indikator==1);
}; // sortiraj listu

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

Poziv metode: lista-> sortiraj_listu();

10

Veleuilite u Rijeci

Metoda za dealokaciju liste

student *dealokacija_liste(){ //dealokacija liste


student *tekuci,*prethodni;
prethodni=this;
tekuci=this->slijedeci;
while (tekuci){
delete prethodni;
prethodni=tekuci;
tekuci=tekuci->slijedeci;
} //while
delete prethodni;
return NULL;
}; //dealokacija_liste
Poziv metode:
lista=lista->dealokacija_liste();
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

11

Veleuilite u Rijeci

Prijatelj klase
Prijatelj klase predstavlja izuzetak od
pravila da privatnim lanovima klase
mogu pristupati iskljuivo metode iste
klase.
Pojedina klasa moe dodijeliti nekoj
funkciji, metodi neke klase ili itavoj
klasi pravo pristupa vlastitim privatnim
i zatienim lanovima.
Takve funkcije, metode i klase nazivaju se
prijatelji klase, a oznaavamo ih
mr. sc. Jasminka Tomljanovi, vii predava
pomou kljune rijei friend.
11/12/16

12

Veleuilite u Rijeci

class osnovna{
friend void funkcija1();
// funkcija1 je prijatelj klase
osnovna
friend void kolega::fclan1();
// metoda fclan1 klase
kolega,
friend class prijatelj;
// kao i klasa prijatelj
private:
void privatna(){ // prijatelji klase mogu pozivati ovu
metodu
cout << "Privatni funkcijski clan!" << endl;
};
};
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

13

Veleuilite u Rijeci

Nasljeivanje

Nasljeivanje je postupak kojim se iz


postojee klase izvodi nova, tako da ta nova
klasa:
zadrava (tj. nasljeuje) sve atribute i
metode osnovne klase (osim privatnih)
implementacija metoda moe se
promijeniti
nova klasa moe ukljuivati i druge
lanove, osim naslijeenih (polimorfizam)
mogue je da jedna klasa naslijedi vie
osnovnih klasa (viestruko nasljeivanje)

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

14

Veleuilite u Rijeci

pristup lanovima osnovne klase iz objekata


izvedene klase definiran je odgovarajuim
specifikatorom tipa nasljeivanja
(private, protected ili public).
prava pristupa naslijeenim lanovima
mogu biti reducirana u odnosu na prava
pristupa iz objekata osnovnih klasa

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

15

Veleuilite u Rijeci

Primjer jednostavnog nasljeivanja: vozila


UML dijagram klasa
vozilo
godiste,tezina,
snaga_motora,
max_brzina
ispis()

automobil

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

kamion

autobus

nosivost

broj_sjedala

ispis()

ispis()

16

Veleuilite u Rijeci

jednostavnog nasljeivanja: vozila


class vozilo{
// definira zajedniko za sva vozila
public:
int godiste, tezina, snaga_motora, max_brzina;
void ispis(){
cout << "Vozilo : " << endl;
cout << "Godiste : " << godiste << endl;}; //ispis
};
class automobil : public vozilo{}; //automobil nasljeuje
vozilo
class kamion : public vozilo{ //kamion nasljeuje vozilo
public:
//tip nasljeivanja
int nosivost;
void ispis(){
// metoda ispis je redefinirana
cout << "Kamion : " << endl;
cout << "Godiste : " << godiste << endl;
cout << "Nosivost : " << nosivost << endl;};
17
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava
};

Veleuilite u Rijeci

Zatieni lanovi klasa


Zatieni lanovi klasa (protected) mogu
se nasljeivati, ali su dostupni jo samo unutar
klasa koje nasljeuju osnovnu klasu tj. nisu

javno dostupni
Primjer:
class lista{
protected: lista *slijedeci;
izvedenim klasama

}; //lista
class student:public lista{
dodjele tipa
...

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

//za

upotrebu

//operator
18

Veleuilite u Rijeci

Tipovi nasljeivanja
Prava pristupa naslijeenim lanovima klasa
mogu i ne moraju biti ista kao u osnovnoj
klasi, to je odreeno tipom nasljeivanja:
javno nasljeivanje (public) odreuje da
e svi atributi i metode osnovne klase
imati ista prava pristupa iz izvedene klase
kao i iz osnovne klase.
zatieno nasljeivanje (protected)
odreuje da e naslijeeni lanovi osnovne
klase biti dostupni iz izvedene klase, ali s
najviim pravom pristupa protected (tj.
svi javni lanovi osnovne klase postat e
19
mr.11/12/16
sc. Jasminka
Tomljanovi, u
vii izvedenoj).
predava
zatieni

Veleuilite u Rijeci

privatno nasljeivanje (private) odreuje


da e svi naslijeeni lanovi osnovne klase u
izvedenoj klasi imati pravo pristupa private
(tj. bit e privatni u toj klasi i nee se moi
dalje nasljeivati).
specifikacija zatienog nasljeivanja
class izvedena : protected osnovna{
...
};
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

20

Veleuilite u Rijeci

osnovna
public: void fpub()
private: void
fpriv()
protected: void
fprot()

klasa_public

klasa_privat
e

izv_public

izv_private

public: void
fklasa_public()

public: void
fklasa_private()

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

klasa_protect
ed

izv_protecte
d
public: void
fklasa_protected()

21

Veleuilite u Rijeci

Viestruko nasljeivanje
klasa_prva

klasa_druga

int kilometraza,
godina

void
ispis(kilometraza,
godina)

klasa_izvedena

void ispis()

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

22

Veleuilite u Rijeci

Virtualne metode i polimorfizam


Problem objektnog programiranja je
visoki stupanj tipizacije to zahtijeva
mehanizam automatske konverzije
tipova
Polimorfizam omoguuje jednostavnije
rukovanje
heterogenim
strukturama
podataka
koristi mehanizam virtualnih metoda
i kasnog povezivanja (eng. late
binding)
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

23

Veleuilite u Rijeci

Primjer: Vozila
razliita vozila (npr. automobili, autobusi i
kamioni) predstavljaju objekte iz razliitih
klasa s jednom osnovnom klasom koju
nasljeuju (vozilo)
zadana struktura podataka (ovdje vezana
lista) sadri objekte iz sve tri klase
da li je mogue prijei cijelu strukturu (ovdje
vezanu listu) pomou istog pokazivaa (npr.
iz klase vozilo)?
ako svaka od klasa koje se odnose na vozila
definira vlastitu metodu za ispis podataka, da
li je mogue preko pokazivaa iz klase vozilo
24
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava
pozvati odgovarajuu, tako da se ispiu

Veleuilite u Rijeci

koritenje virtualnih metoda u


osnovnoj klasi znai da e se kod
poziva odgovarajue metode koristiti
mehanizam kasnog povezivanja koji
e prepoznati tip (klasu) odgovarajueg
objekta (iz klase koja nasljeuje
osnovnu) i pozvati odgovarajuu
metodu
mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

25

Veleuilite u Rijeci

Apstraktna klasa
Apstraktna klasa je klasa iz koje se ne
moe instancirati objekt, nego slui samo kao
osnova za nasljeivanje
da bi klasa bila apstraktna, mora sadravati
barem jednu istu virtualnu metodu
Primjer:
class apstraktna{
public:
int kilometraza,godina;
virtual void unos()=NULL; //iste virtualne metode
virtual void ispis()=NULL;};

pokaziva

na

funkciju

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

dobiva

26
vrijednost

Veleuilite u Rijeci

Primjer:
class apstraktna{
public:
int kilometraza,godina;
virtual void unos()=NULL; //iste virtualne
metode
virtual void ispis()=NULL;};

pokaziva na funkciju dobiva


vrijednost NULL, to znai da ne
postoji

implementacija

mr.11/12/16
sc. Jasminka Tomljanovi, vii predava

te

funkcije
27

You might also like