Theory C++ Programming

You might also like

You are on page 1of 18

1

1. Problemi kompatibilnosti, kontinuiteta i ponovnog korienja


Problem kompatibinosti je osnovni problem struktuirane metodologije koja se bavi
dekompozicijom algoritma. Problem nastaje kada razliiti timovi realizuju razliiti
podprograme jednog programa, kada jednu vrstu podataka definiu razliitim strukturama
podataka, pa se takvi podprogrami ne mogu implementirati u jedinstven program. Ovaj
problem se vidi tek kod velikih projekata kada i mali problem moe da ima katastrofalne
posledice. Da bi izbegli ovakav problem, potrebno je na poetku definisati i napraviti sve
strukture podataka pa tek onda prisupiti izradi.
Problem kontinuiteta svaki softver se vremenom proiruje i nadograuje kako bi opstao
na tritu. Struktuirano programiranje ne garantuje da e softver biti proiriv, vrlo je teko
raditi izmene kod algoritamsko orijentisanog programa za razliku od unosa izmena u strukturu
podataka.
Problem ponovnog korienja, odnosno mogunost vietruke upotrebe, radi se o tenji da
se jednom napisan i testiran softver u celini ili delimino koristi u razliitim projektima, dakle
kad god se pojavi potreba za njim. Ponekad se zahteva i promena ili dopuna programa to je ne
mogue ostvariti u algoritamskom programu.

2. Odnos algoritama i strukture podataka
Objektni programer se koncentrie ne na analizu reenja, ve na analizu problema,
zadravajui se to je mogue due u domenu problema. Cilj analize je identifikovanje
elemenata (entiteta) i njihovih veza u domenu problema. Potom se pristupa modelovanju
pojedinanih elemenata i veza da bi se traeni program, po pravilu algoritamski kratak,
realizovao tek na kraju. Objektno orijentisan postupak, za razliku od sturktuiranog ne polazi od
pitanja ta program treba da radi? nego se njime faktiki zavrava. Elementi domena
problema (entiteti) modeluju se grupisanjem u klase i opisom klasa kroz naziv, bitne osobine
(atribute) i repertorar operacija primenljiv na primene klase koji nose naziv objekti. Klase se
realizuju jedan jedini put, a zatim u prevedenom obliku, dakle bez korienja izvornog koda,
koristi gde god je to potrebno, ak uz mogunost modifikacije i proirivanja bez intervencija u
izvornom kodu. Svaki objekat predstavlja celinu za sebe i ima jasnu logiku barijeru koja ga
odvaja od drugih objekata. Kako u pogledu strukture podataka tako i u pogledu algoritama.
Ovim problem kompatibilnosti nestaje jer ne postoji nekakva zajednika struktura podataka
koja bi stvarala nekompatiblinost. Problemi kontinuiteta i ponovnog korienja softvera
reavaju se uz pomo mehanizma nasleivanja koje omoguuje da se objekat menja i proiruje
bez upotrebe izvornog koda. Odnosno:
- Prvo se ustanovi domen problema kome pripada na problem i pravi se njegov model.
- Objektni programer uoava entitete i povezuje ih u klase entiteta i tek onda ga softverski
modeluje.
- Kljui deo objektnog programiranja je da u podacima ne stoje samo osobine entiteta, ve i
operacije nad tim entitetom.
- Kad se zavri rad na jednoj klasi poinje rad na drugoj i tek kada se sve ovo zavri
2

programer se vraa na poetni problem.
- Kratkoa glavnog programa je karakteristina za C++
- Jednom napisana klasa se vise ne mora menjati ve se ona koristi uz dodavanje osobina sa
upotrebom mehanizma nasleivanja.
Objektna metodologija se zasniva na nekoliko osnovnih principa:
Apstrakcija predstavlja izdvajanje, odnosno uoavanje bitnog i zanemarivanje nebitnog.
Skrivanje informacija, podrazumeva da klijentu ne moraju biti poznati detalji realizacije
programa, time smanjuje koliinu informacija koju programer i klijent moraju drati u glavi.
Razlog skrivanja informacija je smanjivanje kompleksnosti koju programer mora da razume,
takoe, ne moraju biti poznati detalji realizacije programa.
Inkapsulacija, sredstvo za objedinjavanje strukture i funkcionalnosti. To je tehnika kojom
se pri realizaciji objedinjuju deskriptivne i dimanike osobine modela entiteta potujui pri
tome princip skrivanja informacija.
Modularnost je tehnika razlaganja sloenog softverskog sistema u domenu implementacije
na jednostavnije elemenete koji imaju unutranju logiku. Modularnost predstavlja mogunost
proirivosti i viekratne upotrebe.
Polimorfizam je mogunost da se softverska komponenta ponaa zavisno od konteksta ili
okolnosti. Polimorfno se mogu ponaati objekti, promenljive i funkcije.
Veze izmeu klasa su jedan od bitnih elemenata, gde se vezama ostvaruje ureenje
apstrakcija. Najveu vanost ima nasleivanje, tj. izvoenje klase iz klase, a ono predstavlja
prenoenje osobina jedne klase na drugu uz mogunost dopune i modifikacije bez izmene
izvornog koda prve klase.

3. Definicija klase i objekta, svojstva objekata
Najbitnije osobine objekta su: identitet, stanje i ponaanje. U objektnom sistemu svaki
objekat je jedinstven.
Identitet predstavlja osobinu objekta da se izdvaja od ostalih objekata i po kome je
prepoznatljiv.
Stanje je deo prolosti i sadanjosti objekta. Neophodan je za odreivanje njegovog budueg
ponaanja. To ponaanje sadri i promenu stanja.
Ponaanje je reakcija na pobudu i ono je odreeno operacijama.
Iz ovih objanjenja izvodimo definiciju objekta:
Objekat je softverski model individualnog pojma za stvar ili proces zasovan na stanjima i
koji sadri osobine relevantne za domen problema. Objekat kao sastavni deo moe da ima i
druge objekte, odnosno objekti sadre podatke o sebi kao i podobjekti. Objekat zajedno sa
svojim podobjektima i njihovim podobjektima ini strukturu objekata. Svi objekti jedne klase
imaju istu strukturu i isto ponaanje.
Klasa je softverski model klasnog pojma za stvari ili procese zasnovane na stanjima i koja
sadri osobine relevantne za dati domen problema. Klasa se sastoji od tri stvari: 1) podatak-
lan, 2) objekat-lan, 3) funkcija-lan.
3

Objekat-lan i podatak-lan se jednom reju zovu polje. Od deskriptivnih osobina objekti
imaju samo atribute. On otvara problem jer svako tvrdi da je neto drugo. Tako je atribut
nekada polje, nekada podatak-lan, nekada i sama metoda. Atributi nisu objekti jer nemaju
sopstveni identitet, semantiki su nestabilni i dobijaju smisao samo u sklopu objekta u kome
egzistiraju. Aktiviranje funkcije-lanice zovemo slanje poruke ili poruka. Za korisnika klase
uvodi se pojam klijent.
Principi objektnog programiranja:
1) Sve je objekat u program nema nieg drugog osim objekta, nema podprograma, nema
funkcija pa ak ni konstanti. Kod C++-a nije tako jer je on hibridni jezik i kod njega postoje
slobodne funkcije.
2) Program je skup objekata koji zadaju poslove jedan drugom, putem slanja poruka, objektni
nain razmiljanja je komunikacija objekata.
3) Svaki objekat poseduje sopstvenu memoriju, sastavljenu od drugih objekata (i drugih
promenljivih). Objekti ne smeju deliti memoriju.
4) Svaki objekat pripada nekoj klasi.
5) Svi objekti iste klase primaju iste poruke.

4. Deklarisanje klase u C++-u
Najvaniji pojam u objektnom programiranju je klasa. C++ za stvaranje klase ima posebnu
naredbu class. Definicija klase:
class ImeKlase {
// podaci-clanovi
// objekti-clanovi
// funkcije-clanovi
};
ImeKlase :: ImeFunkcije {
// telo-funkcije
}
Definicija se deli na dva dela, sastoji se od zaglavlja: tela modula tako da se deklaracija
funkcija-lanova nalazi u zaglavlju, a definicija u telu. Definicija klase se zavrava znakom
;. Imena funkcija, klasa, objekata se piu tzv. kamel notacijom (ime svake nove rei u
nazivu se pie velikim slovom, poetno slovo za sva imena je malo osim za ime klase koje
poinje velikim poetnim slovom). Kao podatak-lan definiemo osobine onoga to
modelujemo, a zatim definiemo operacije nad tim to modelujemo. Pri pisanju metoda treba
da pazimo da ih ne bude ni premalo ni previe. Ako je metoda premalo naii emo na problem
da e nam neka operacija zatrebati a mi je neemo imati na raspolaganju. Metoda set vri se
nad objektom i postavlja odreene vrednosti za promenljive. Metoda get slui da se oita
promenljiva i ona vraa kao rezultat ba tu promenljivu. Metode koje su u potpunosti
definisane unutar klase nazivaju se UMETNUTE ili INLINE metode. Unutar umetnutih
funkcija mogu da stoje same naredbe dodele, a ne neke komplikovane naredbe, poput petlji.
Detalji realizacije programa treba da budu skriveni, a to znai da delovi klase moraju da budu
4

skriveni. Podaci-lanovi su u najveem broju sluajeva zatvoreni da bi se njihova izmena vrila
pod kontrolom. Kontrola promene sadraja podataka lanova je glavni razlog zatvaranja
podataka-lanova. Objekti-lanovi se mogu ostaviti otvorenim ili se mogu zatvoriti. Funkcije-
lanovi (metode) se uvek otvaraju. Zatvoreni deo poinje slubenom reju private, dok
otvoreni poinje reju public. Otvorenost ili zatvorenost traje sve dok se ne pojavi suprotna
labela ili do kraja klase. Obino se prvo definie zatvoreni deo. Zatvoreni deo poinje nekad i
slubenom reju protected koji omoguava pristup samo nasledniku klase.
Referenca ili upuiva u programskom jeziku C++ je alternativno ime za neki podatak.
Reference nisu podaci, ne zauzimaju prostor u memoriji, pa se ne moe traiti njihova adresa.
Reference se pridruuju nekom podatku koji se ve nalazi u memoriji. One ne mogu da
promene vrednost, sve izvrene operacije nad referencama deluju na originalne podatke.

5. Definicija i vrste apstrakcije. Princip skrivanja informacija
Apstrakcija je radnja kojom izostavljamo pojedinano, sluajno, sporedno, a zadravamo
opte, bitno, nuno, vano. Kada objektno programiramo mi u stvari modelujemo stvari i pri
tome se koristimo apstrakcijom. Model je apstrakcijom uproena slika onoga to modelujemo.
Od svih apstrakcija, najbitnije su dve:
Apstrakcija entiteta je model neke konkretne stvari. Ovu vrstu imamo kada zadravamo
samo bitne osobine nekoga entiteta. Objekat i klasa predstavljaju apstrakciju entiteta.
Stavljanje u drugi plan detalja realizacije, detalji realizacije su proglaeni za nebitne.
Postoje jo i apstrakcija akcije, klasa obezbeuje skup operacija iste kategorije, apstrakcija
virtuelne maine, skup operacija nieg niova zamenjuje se jednom operacijom vieg nivoa
apstrakcije, sluajna apstrakcija, klasa koja objedinjuje stvari koje nisu meusobno povezane.
Princip skrivanja informacija, detalji realizacije ne samo da treba da budu razvojeni od
interfejsa, nego treba da budu skriveni od korisnika. Ukoliko ovaj princip nije potovan,
program koji smo napisali nita ne valja. Sve to je realizacija treba da bude nedostupno
klijentima. Prednost skrivanja informacija je i ta da korisnik i ne oseti kada mi promenimo
neku metodu, tj. kada nadogradimo softver.

6. Pojam inkapsulacije i realizacija u C++-u. Pravilo inkapsulacije
Inkapsulacija je sredstvo za objedinjavanje strukture, ponaanja u softversku celinu tako da
bude ostvarena kontrola pristupa. U C++-u strukturu ine polja, a ponaanje ine metode.
Inkapsulacija u C++-u je sredstvo za objedivanjanje podataka-lanova, objekata-lanova i
funkcija-lanica u jednu celinu. Nju ine naredba class, zatim ako se metode ne nalaze u klasi,
koristi se ::, kontrola pristupa se vri labelama private i public, ili labelom privilegovanog
pristupa protected, gde public otvara, a private zatvara lanice klase, dok protected omoguava
pristup samo nasledniku klase.
Pravilo inkapsulacije: klasu (objekat) treba koristiti disciplinovano u skladu sa
dokumentacijom proizvoaa.
5

7. Pojam modula i primena u objektnom programiranju
Modul je svaka softverska komponenta koja se realizuje, projektuje, kodira i testira
autonomno. Osnovna svrha modula je viekratna upotreba (klasa zahteva viekratnu upotrebu i
zato su moduli i klase u jakoj vezi). Modul predstavlja skup servisa namenjen svakom klijentu.
U C++-u ulogu modula igra biblioteka. Sastoji se od interfejsa (ekstenzija .hpp) i tela modula
(ekstenzija .cpp). Moduli se ne mogu samostalno izvravati, ali slue za smetanje klasa tako
to se u interfejsu modula smeta naredba class, zajedno sa eventualnim inline metodama, dok
se u telo modula smetaju definicije ostalih metoda.
Odnos klase i modula: Klasa se nalazi u modulu, nikad se ne nalazi u glavnom programu.
Ova injenica je diktirana Meyer-ovom jednakou klasa=modul, znai svaka klasa se nalazi u
sopstvenom modulu. U C++-u ovo nije mogue zbog velikog broja klasa pa je ova jednakost
zamenjena Mayer-ovom inkulzijom klasa je podskup modela, to znai da se vie klasa
moe nai u istom modelu. U modelu se nalaze klase koje su po nekoj logici srodne.

8. Klasifikacija operacija nad objektima (*)
Kod objektnog programiranja sve, ukljuujui i definisanje, je operacija. Klasifikacija
operacija se odnosi samo na tipine, a ne na sve mogue metode. Metode klasifikujemo u 5
grupa koje nisu sasvim disjunktne, to su:
Konstruktori i inicijalizatori Konstruktori su metode koje imaju zadatak da uestvuju u
kreiranju objekata ili promenljive, i mogu, ali ne moraju da sadre njihovu inicijalizaciju.
Inicijalizator je operacija kojom se objekat iskljuivo dovodi u neko poetno stanje. U C++
ovaj postupak uglavnom radi konstruktor, koji zauzima prostor u memoriji i pozivaju se
implicitno naredbama za definisanje podataka.
Destruktori i terminatori Destruktori su specijalne metode koje ili direktno unitavaju
ranije kreiran objekat ili uestvuju u toj operaciji. Sama operacija unitavanja promenljive ili
objekta podrazumeva oslobaanje njihovog memorijskog prostora, a koriste se kad imamo
dinamiko zauzimanje memorije.
Terminator prevodi objekat u neko zavrno ili tanije zamrznuto stanje. Razliku izmeu
destruktora i terminatora je u tome to posle primene destruktora objekat postaje nedostupan
(praktino mu se oduzima identitet), dok ga terminator ostavlja u nekom od stanja iz kojeg se
opet moe inicijalizovati bez promene identiteta.
Selektori i indikatori su operacije kojima se pristupa sadraju. Selektori vre odabir nekih
podataka (tipian selektor u C++-u je .). Indikatori su obine metode kojima se oitavaju
obini podaci. Skup indikatora mora biti takav da pomou njih mora biti odreeno stanje
objekta esto imaju prefiks get daju informacije o stanju objekta ili o vrednosti promenljive.
Modifikatori su metode kojima se menja stanje objekta ili vrednost promenljive. esto
imaju prefiks set, oni mogu da budu u klasi, a i van nje. Praktino, nema klase bez
modifikatora budui da je u prirodi objekta da bude aktivan.
Iteratori su grupa operacija koja se vezuje za sloene tipvoe i klase. Iterator je operacija
koja ostvaruje (omoguava) pristup svim delovima kompozitne (sloene) promenljive ili
6

objekta u odabranom redosledu. U C++-u naredba for je iterator za niz. Iterator ima tri
elementa: startovanje, prelazak na sledei element i provera kraja.

9. Konstruktori i destruktori u C++-u
Svaka klasa mora imati jedan ili vise konstruktora.
Konstruktor je metoda za kreiranje objekta iz klase tj. instanciranje klase. Konstruktori su
specijalne metode na koje programer ima uticaj. Inicijalizaciju objekta najee radimo u
sklopu konstruktora. Osobine konstruktora su sledee:
- konstruktor nosi ime klase, svi konstruktori se zovu identino kao i klasa u kojoj se nalaze
- konstruktor nema nikakav tip. (Isti je kao i tip klase)
- nain poziva je razliit od poziva ostalih metoda (nije z.Complex nego je Complex.z)
U klasi iza labele public uvek se prvo piu konstruktori, zatim destruktori, a zatim i ostale
metode. Svaka klasa ima bar dva konstruktora, iako ih mi ne napiemo. To su ugraeni
konstruktori. Jedan je konstruktor objekta, a drugi konstruktor kopije. Ako napiemo
konstruktor ugraeni se vie ne koristi. Ugraeni konstruktor ima ulogu samo u zauzimanju
memorije. Podrazumevani konstruktor je konstruktor bez parametara. Ako u klasi ima mnogo
konstruktora prilikom implicitnog poziva poziva se podrazumevani konsturuktor. Zato klasu
esto tako piemo da napiemo i podrazumevani konstruktor da bih u pomenutom sluaju on
bio pozvan. Podrazumevane vrednosti parametara se ne vezuju iskljuivo za konstruktore ve i
za slobodne funkcije i metode. Konstruktor kopije slui za pravljenje kopije objekta.
Pojavljuje se u kontekstu prenoenja argumenata po vrednosti. On je zaduen da ceo objekat
kopira na stek, on postoji u svakoj klasi (ugraen). Konstruktor treba da bude otvorena metoda.
Destruktor ima zadatak da uniti objekat. Po njegovoj primeni objekat nije vise na
raspolaganju. Pre njega se ne navodi nikakav tip jer je podrazumevani tip void. On se poziva
specijalnim znakom ~ (tilda) i nikada nema nikakve parametre. Svaka klasa ima samo jedan
destruktor. U sluaju da ima bar jedan podatak-lan koji je u dinamikoj memoriji (heap-u)
obaveno moramo samostalno definisati destruktor koji e pri unitavanju objekta osloboditi
svu zauzetu memoriju. Destruktor se najee sam poziva kada objekat izae iz opsega. Nema
argument, ali moe imati telo u kojem se nalaze naredbe koje se izvravaju prilikom
izvravanja destruktora.

10. Kooperativne (prijateljske) funkcije, friend
Za kooperativne funkcije se esto koriste jo dva izraza kao to su prijateljske ili friend
funkcije. To su slobodne funkcije, koje imaju pristup svim elementima klase (osim polju *this
koji je pokaziva objekta na samog sebe) bilo da su public ili private. Ova funkcija nije fiziki
lan te klase nego je logiki tesno vezana za tu klasu i nalazi se u istom modulu sa klasom.
Dodavanjem identifikatora friend ispred deklaracije funkcije, proglaavamo tu funkciju
prijateljskom funkcijom klase u kojoj se nalazi. Prilikom proglaavanja funkcija za prijateljske,
princip skrivanja informacija ne sme biti naruen. Da se to ne bi desilo klasa proglaava
funkciju prijateljskom. I klase se mogu proglasiti prijateljskim, a takoe i metode jedne klase u
7

drugoj. Izgled: friend opisi_tipa ImeFunkcije(niz argumenata); Korienjem prijateljskih
funkcija dobijamo poveanu brzinu izvrenja funkcije, jedna funkcija moe pristupiti
lanovima nekoliko klasa. Koriste se kod preklapanja operatora.

11. Pojam i vrste polimorfizma
Polimorfizam je konteksno, zavisno ponaanje (odreene kategorije se u zavisnosti od
okolonosti ponaaju drugaije). Tako se ponaaju promenljive, objekti i funkcije.
1) Univerzalni polimofizam, jedna kategorija se ponaa razliito u zavisnosti od okolnosti.
Imamo dve podvrste:
- parametarski polimorfizam funkcije je osobina funkcije da podeava svoje ponaanje
prema tipu podataka. Klase i tipovi koji iskazuju osobine ovog polimorfizma su generike
klase i generiki tipovi.
- inkluzioni polimorfizam je osobina promenljive da moe istovremeno pripadatai veem
broju tipova (npr. char koji je i int)
2) AD HOC polimofizam, prividni polimorfizam, jedna oznaka za vise srodnih kategorija
koje se razliito ponaaju. Imamo dve podvrste:
- preklapanjeje polimorfizam kada u jednoj klasi mogu da se nau funkcije sa istim imenom
i operatori sa istim znakom.
- koercitivni (prinudni) polimorfizam, promenljiva biva prinuena da se ponaa kao neka
druga promenljiva ili kao promenljiva drugog tipa, odnosno prinuena je da promeni svoj tip.
Razliito ponaanje iste kategorije.

12. Preklapanje funkcija i operatora u C++-u
Mehanizam preklapanja funkcija je jednostavniji od mehanizma preklapanja operatora.
Preklapanje funkcija C++ dozvoljava da dve razliite metode u dve klase nose isto ime jer
kod poziva datih metoda ne moe da doe do zabune jer se tano vidi na koji se objekat koja
funkcija odnosi. Metode ili slobodne funkcije koje u klasama rade isti posao treba da nose isto
ime. Samo ime i broj argumenata identifikuju funkciju. Pravilo ouvanja semantike: funkcije
koje imaju isto ime treba da rae isti posao tj. da imaju istu semantiku. Preklopljene funkcije se
moraju razlikovati po ulaznim parametrima. Preporuuje se da se kod funkcija koje se
8

preklapaju ne koriste parametri na podrazumevanim vrednostima. Deklaracija:
double f(double, double)
double f(double)
Pozivanje: f(x,y), f(x)
Preklapanje operatora Svrha preklapanja je olakani rad sa vrednostima i pisanje operacija
koje su blie logici. Vai zakon o odravanju semantike, koji kae da prilikom biranja
operatora koji preklapamo mi biramo operator koji je po osobinama isti kao na ili bar veoma
slian. Samo operatori iz C-a mogu da se preklope, poto preklapamo ve postojee operatore
zadravaju se sve osobien osnovnih operatora. Sve klase moemo u dve grupe:
1) Metodski orijentisane klase, nemaju preklopljenih operatora sem operatora dodele =
ili relacionih operatora == i !=.
2) Operatorski orijentisane klase, nemaju metoda i preteno se sastoje od prekloljenih
operatora i friend funkcija. One su specijalna vrsta.
Preporuka: ako operator menja stanje operanda onda ga preklapamo metodom, a ako ne
menja stanje operanda onad je kandidat friend funkcija, ali opet se moe preklopiti i metodom.
Svaki objekat ima polje *this i ono predstavlja pokaziva objekta na samog sebe. Ovo polje se
moe pojavljivati samo u metodama.
Preklapanje osnovnog operatora dodele:
- najvaniji oblik preklapanja
- vri se iskljuivo metodom
Complex &operator=(const Complex &z) {
r=z.r;
i=z.i;
return *this;
}
Preklapanje operatora +=, -=, *=, /=
- ove operacije se preklapaju isklju;ivo metodama jer one menjaju stanje objekta
Complex &operator+=(const Complex &z) {
r+=z.r;
i+=z.i;
return *this;
}
Preklapanje relacionih operanada ==, !=
- ove operande preklapamo iskljuivo slobodnim prijateljskim funkcijama
class Complex {
.
friend int operator==(const Complex &, const Complex &)
};

int operator==(const Complex &z1, cont Complex &z2) {
return(z1.r=z2.r) && (z1.i == z2.i);
}

9

Preklapanje aritmetikih operanada +, -, *, /
- preklapa se slobodnim prijateljskim funkcijama
Complex operator+(const Complex &z1, const Complex &z2) {
Complex w;
w.r=z1.r+z2.r;
w.i=z1.r+z2.r;
return w;
}
Preklapanje inkrementa i dekrementa ++
- ovo su unarni operatori i menjaju stanje objekta, s toga i preklapamo metodama
1) prefiksni oblik
Complex &operator++() {
++r;
++i;
return *this;
}
2) sufiksni oblik
Complex &operator++(int x) {
Complex w(r.i);
r++;
i++;
return w;
}
Preklapanje operatora ()
- preklapanje ovog operatora omoguuje parametrizovan pristup objektu i njegovo
pobuivanje. Preklapa se kao metoda.
Preklapanje operatora indeksiranja [ ]
- operator indeksiranja preklapamo kada se u private delu klase nalazi skriven neki niz.
Preklapa se kao metoda.

13. Konverzija tipova u C++-u
Konverzija u C++-u je drugi naziv za prinudni ili koercitivni polimorfizam. Potreba je
prinuditi neki objekat da se ponaa kao objekat druge klase. Postoje dve vrste konverzije:
automatska ili implicitna (npr. sabiranje double i int tipa) i eksplicitna (npr. (mt)y koju
programer definie).
Konverzija u klasu ovde spadaju konverzije iz tipa u klasu i iz klase u klasu, gde se
konverzija tipa u klasu obavlja preko konstruktora.
Konverzija iz klase kada konvertujemo tip iz klase K u klasu A, dodeljujemo konstruktor
klasi A, oblika A(K&K) {}. Konverzija iz klase u tip se obavlja preklapanjem operatora
typecast i pie se metoda operator tip(){}. Ako hoemo da konvertujemo objekat u tip
pisaemo (tip)k.

10

14. Tipovi veza izmeu klasa
Veza je model odnosa izmeu pojmova ili klasa. Veze izmeu klasa se dele na: klijentske
veze i nasleivanje (najvanija veza). Tipine vrste klijentskih veza su:
- Asocijacija povezivanje semantiki nezavisne klase bez posebnih pravila

- Agregacija modeluje odnos celina-deo
- Kompozicija odnos celina-deo, ali je ivotni vek dela sadran u ivotnom veku celine,
ona predstavlja najvru vezu.
- Veze zavisnosti sadre mnogo veza koje nemaju veze meusobno, predstavlja aroliku
grupu veza.

15. Agregacija
Ova veza izmeu klasa modeluje odnos celina-deo. U objektnim jezicima ne postoje
posebna sredstva za njenu realizaciju. Postoje dva tipa koja se razlikuju po vrstini veze:
Kompozicija (veza po vrednosti) vrsta veza, ako je klasa A komponovana od klase B,
tada je objkat klase B objekat-lan klase A i oni dele istu memoriju. ivotni vek objekta klase
B sadran je u ivotnom veku objekta klase A. Ovo je najvra veza izmeu klasa. Svaka veza
se snabdeva kardinalitetom koji predstavlja odnos instance. Svakoj vezi se moe dodati ime.

, jedna du sadri dve krajnje take
ista agregacija (veza po referenci) objekat ija je klasa A komponenta neke druge klase
B moe da postoji pre objekta ija klasa sadri njegovu tj. ivotni vek objekta klase A ne zavisi
od ivotnog veka objekta klase B. Veza moe da se realizuje pomou niza ili liste.
11


, jedan fakultet sadri 0 ili vie odseka

16. Definicija i osobine nasleivanja
Nasleivanje modeluje odnos izmeu dve klase. Sa jedne strane predstavlja vezu
generalizacija-specijalizacija ili opte-pojedinano (npr. veza budilnik-sat)

Sa druge strane nasleivanje je bitno kao sredstvo kojim se obezbeuje viekratna upotreba.
Definicija: Nasleivanje predstavlja preuzimanje kompletnog sadraja neke druge klase uz
mogunost dodavanja lanova svih vrsta i modifikacije metoda.

Osobine nasleivanja:
- Izvoenje klase B iz klase A ne zahteva pristup njenom izvornom kodu.
- Klasa B preuzima sve to sadri klasa A, s tim da moe jo sadraja da se doda.
U klasi B se mogu dodati nova polja ili metode.
- Mogunost modifikacije metoda. Isti posao u klasi A i klasi B se ne izvrava istom
metodom. Modifikacija metode se zove redefinisanje, jer nema drugog naina da metodu
promenimo nego da je ponovo napiemo pod istim imenom.
- Tranzitivnost ako klasa C nasleuje klasu B, a ona nasleuje klasu A, onda klasa C
nasleuje klasu A.
- Viestruko nasleivanje nasleivanje kod koga klasa nasleuje dve ili vie klasa.






12

17. Demetrin zakon i zakon supstitucije
Demetrin zakon povezuje nasleivanje i inkapsulaciju. Npr. imamo klase A i B i klijenta x.
Odnos izmeu A i B je mnogo vri nego izmeu B i
x. Metode klase B imaju pristup public delu klijenta x.
Meutim metode iz klase B mogu da pristupaju i
private delu klase A.

Demetrin zakon: Metode klase ne smeju ni na koji nain da zavise od strukture neke druge
klase osim neposrednog pretka.
Zakon supstitucije (povezuje nasleivanje i inkluzivni polimorfizam): Ako za svaki objekat
s klase S postoji objekat t klase T takav da se proizvoljni program definisan nad klasom T
ponaa isto kada se t zameni sa s, tada je S izvedena klasa od T. (Ako se predak zameni
potomkom, u programu nita ne sme da se promeni. U ovom sluaju se potomak ponaa
polimorfno jer se ponaa kao predak).

18. Realizacija nasleivanja u C++-u
Postojanje nasleivanja oznaava se kao: class B: aA, gde apredstavlja kontrolu pristupa i
moe da bude public, private ili nita. Kod nasleivanja na ovaj nain se regulie pristup
metodama iz klase potomaka. Postoji i trea vrsta komande pristupa protected, a njoj imaju
pristup sve klase koje nasleuju tu klasu, ali ostale klase nemaju. Tabela pristupa:

Nasleivanje lanovi osnovne (bazne) klase
a
public protected private
public public protected private
protected protected protected private
private private protected private

Ne nasleuju se: konstruktor, destruktor, operator dodele i prijateljske funkcije. Redefinisanje
metode izvodi se tako to se metoda ponovo napie u klasi potomka. Nova metoda ne mora da
ima iste parametre, niti tip parametara, sve moe da se razlikuje sem imena.

19. Inkluzivni polimorfizam u C++-u
Vrsta polimorfizma u kojoj se neka promenljiva ponaa kao da menja tip (primer: tip char
kao podtip int-a ima sve njegove osobine, ali i neke sluajne dodatne).
Opte pravilo inkluzivnog polimorfizma: potomak moe zameniti pretka, a obrnuto ne.
Jedan objekat zbog logike moe da pripada samo jednoj klasi, ali on moe u operaciji da bude
tipa klase ili tipa nekog od svojih predaka. Inkluzivni polimorfizam se javlja u dva oblika:
- operacija dodele imamo dva razliita memorijska prostora. Posle izvrene operacije dodele
oba objekta se ponaaju kao i pre. Potomak se ponaa polimorfno.
13


- prenos argumenata posle dodele pPr pokazuje na isti objekat. Sada po izvrenju dodele
pozivamo metodu m() iz pPr i bie pozvana metoda pretka.

Dodela vrednosti izmeu predka i potomka se vri pokazivaima:
1) Pr = Po , 2) *pPr = *pPo , 3) pPr + pPo

20. Virtuelne funkcije

Poetni problem: metoda m() je napisana u vreme formiranja pretka. U njoj se nalazi poziv
metode k(), takoe iz pretka. U potomku je redefinisana metoda k(). Posle se u program poziva
metoda m(), ali ona poziva metodu k() iz pretka, a ne redefinisanu metodu k() iz potomka. Da
bi se to reilo, trebalo je modifikovati prevodilac kod poziva metoda, pa se metode vie ne
pozivaju kao ostale funkcije. Svaka klasa snabdeva se jednom tabelom koja se naziva V-tabela.
U njoj se nalazi veliina objekta i adrese virtuelnih metoda. U V-tabeli izvedene klase nalazi se
adresa redefinisane virtuelne metode (virtuelnost se ne nasleuje) i iz nje e se pozvati
odgovarajua metoda k() iz potomka. Prijateljske funkcije ne mogu biti virtuelne, ni
konsturktor ne moe biti virtuelna metoda. Funkcije se deklariu dodavanjem modifikatora
virtual ispred njihove deklaracije u osnovnoj klasi i on se ne mora ponovo pisati pri ponovnim
14

deklaracijama u izvedenim klasama. Deklaracije virtuelnih metoda u osnovnoj i u svim
izvedenim klasama moraju biti istovetne po imenu, tipu koji vraaju i broju i tipu parametara.
Virtuelna metoda koja nije definisana u osnovnoj klasi naziva se apstraktnom metodom
(virtuelnoj dodamo =0). Praksa je da se za virtuelne metode proglaavaju metode za koje se
oekuje da e kasnije biti redefinisane, a naroito apstrakne metode i destruktori (da bi se
svaka nasleena klasa unitila svojim destruktorom).

21. Viestruko nasleivanje
Viestruko nasleivanje je nasleivanje od vie predaka. Ono podrazumeva da se nasleuje
iz vie klasa. Klasa X nasleuje sve od A i sve od B.

Sutinski problem: u domenu problema ne postoji mnogo situacija gde moemo koristiti
viestruko nasleivanje. Pojavljuje se i problem pogrenog izvoenja (npr. pegaz, ne moemo
izvesti od konja i ptice).
Tehniki problem: Klase A i B od kojih se nasleuje mogu imati metode sa istim imenom.
C++ preputa programeru da rei problem. Programer prvo uoi koja mu metoda treba pa
redefinie metodu pozivajui tu koja mu treba iz prethodnih klasa.
Ponovno nasleivanje Klasu P nasleuju dve klase i njih mogu da nasleuju druge klase.
Znai postoje dve grane nasleivanja koje vode od P.
Ako se pojavi neka nova klasa X koja nasleuje po
jednog predstavnika iz obe grane nastae problem jer
X dva puta nasleuje osobine P. Ovo se reava
virtuelnim nasleivanjem.








22. Generike klase
Generike klase su klase koje imaju druge klase kao parametre (parametrizovan
polimorfizam). Parametrizovane su nazivima klasa. One omoguuju odnos opte-pojedinano i
realizuju parametraski polimorfizam. Mehanizam za izvoenje generinosti su template.
15

Primer generike klase je stek.
template<argument, argument, , argument> opis
gde argument mogu oznaavati tipove ili konstante. U opisu se nalazi definicija klase ili
definicija funkcije:
template<class T, int k>
class VKT {
..
};

23. Veza asocijacije
Veza asocijacije je veza izmeu dve semantiki nezavisne klase. Ovakva veza je veoma
znaajna u projektovanju baza podataka.

Kada ustanovimo da veza postoji onda je bitno odrediti kardinalitet. Asocijacija moe biti i
viestruka.

Kardinalitet pokazuje koliko objekata jedne klase moe biti u vezi sa jednim objektom iz
druge klase. U ovom primeru jedan ili vie profesora (1..*) predaje jedan ili vie predmeta
(1..*). Veza se realizuje preko pokazivaa, pa se moe predstaviti listom ili nizom (za
nastavnika napraviti listu predmeta koje predaje ili obrnuto, kad se predmet unitava kao
objekat mora se iskljuiti iz nastavnikove liste).








16

24. Veze zavisnosti
Veze zavisnosti predstavljaju najrazliitije veze izmeu objekata dveju klasa. (zavisnost
objakata klase A od objekata klase B). Ako objekat klase A zavisi od objekta klase B, on ne
moe da funkcionie ako se pre toga ne konstruie objekat klase B. Treba izdvojiti samo jednu
pod imenom veza korienja.

Ova veza se pojavljuje kada u najmanje jednoj metodi klase A figurie formalan parametar iz
druge klase B.

25. Izuzeci
Izuzetak je namerno izazvan dogaaj ija je svrha predupreivanje otkaza i koji ostavlja
program u zakoenom stanju. Obavezno je praen pojavom nestanka. Incident je vidljiva
manifestacija otkaza. Sistem za rukovanje izuzecima je upravo zasnovan na vidljivoj
manifestaciji incidenta. Izuzetak je namerno izazvan incident s namenom spreavanja pojave
incidenta jer je izuzetak u stvari kontrolisan. ak ako klijent ne eli da reaguje na izuzetak,
dolazi do havarijskog prekida programa, tj. jednom reju preko izuzetka se jednostavno ne
moe prei ili drugim reima on ne moe ostati neprimeen. Izuzetak u sebi objedinjava
havarijski prekid programa i korienje rezultata podprograma kao koda uspenosti. Izuzeci se
ne mogu simulirati zbog postojanja treeg kanala za razmenu podataka izmeu metode i
klijenta. Prvi kanal slui
za slanje podataka u
metodu, preko drugog se
vraa rezultat dok trei
kanal slui za slanje
poruka o izuzecima. On
se ne vidi i prva dva
ostaju slobodna za
standardne prenose pa se
tim reava problem
izraunavanja rezultata.
C++ ima dva naina za rukovanje izuzecima, u zavisnosti kako se modeluju, tj. izuzeci se
mogu softverski realizovati kao objekti ili kao vrednosti. Generisanje izuzetaka i njegovo
prosleivanje klijentu se vri naredbom trow. Prihvatanje i obrada se vri posebnom nardbom
try. U sklopu try bloka nalaze se rukovaoci pozivima, svi nose naziv catch, a u zagradi se
nalaze kvaziparametri jer tu moe da stoji pravi parameter ili samo tip parametra. Potom slede
naredbe C++-a. Moe biti vie catch naredbi i stavljaju se jedna iza druge. Deo koda u try se
normalno izvrava. Bilo gde da se naie na izuzetak izvravanje koda klijenta se prekida i
prelazi se na deo sa rukovaocima izuzetaka. Ispituje se koji od njih moe da prepozna tip
17

izuzetka i pristupa se prvom na koji se naie, a da moe da primi taj izuzetak.

26. Rukovanje izuzecima kao vrednostima
U ovom sluaju izuzetak je obino enumeracija jer sa tim obezbeujemo da znamo u emu
je greka. Kada se generie izuzetak funkcija ne mora da vraa vrednost. Kod koji moe da
sadri rizine izuzetke se nalazi u try bloku pa kad se naie na izuzetak pozove se rukovalac
izuzecima. Meu svim rukovaocima postoji jedan poseban koji se zove univerzalni rukovaoc
izuzecima, on je posebna vrsta rukovaoca koji prihvata sve izuzetke. On se stavlja na kraj, tj.
posle svih ostalih rukovaoca.
enum ErrorCode {underflow, overflow};
T top() {
if (t<0) throw underflow;
return s[t];
}
void push (T el) {
if(t==capacity-1) trow overflow;
s[++t]=el;
}
// u klijentu je
try { .
}
catch (ErrorCode err) {
switch(err) {
case underflow : cout<<Stack underflow<<endl; break;
case overflow : cout<<Stack overflow<<endl;
}
}

27. Izuzetak kao objekat
Programer formira sopstvene klase sa izuzetcima. Npr. mogli bi da napravimo jednu klasu
underflow, a drugu overflow. Ovde je zgodno to to reakciju moemo da ugradimo u klasu.
Kada su neke klase izvedene, kod rukovaoca, rukovaoc potomkom mora da se nae pre
rukovaoca pretka. Ovde emo ove dve klase izvesti iz abstraktne klase StackException. Sve e
bti isto osim to emo umesto dve imati samo jedu catch naredbu.





18

class StackException {
public: virtual void action()=0;
};
class StackUnderflow: public StackException {
public: void action() {
cout<<Stack underflow<<endl;
}
};
class StackOverflow: public StackException {
public: void action() {
cout<<Stack overflow<<endl;
}
};
// u klijentu je:
try {
// rizicne naredbe
}
catch (StackException &ex) {
ex.action();
}

28. Propagacija izuzetaka

Ukoliko doe do izuzetaka u mk njen rad je prekinut. Izuzetak se pojavljuje i u mk-1 (i svaka
prethona) moe da pristupi na tri naina. Kao prvi nain ona moe da ignorie izuzetak. Princip
je da izuzetak ne sme da proe neprimeen. Ovde on ne prolazi neprimeen jer bi sva
odgovornost bila samo na klijentu, ve samo mk prosledi izuzetak dalje. Drugi nain je da se
propagacija zaustavlja kod naredbe try gde se izuzetak obrauje i onda se rad zaustavlja. Trei
nain je kombinacija prva dva. Neka neka funkcija ima try obradu izuzetaka, ali samo ga
delimino obradi i prosledi dalje.

You might also like