misliti na jeziku c++
TRANSCRIPT
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 1/300
Misliri
na
jeziku
C++
,
'
,,1:"
.,
:'
'Bruce
Eckel
MindView,
Inc.,predsednik
,
:i.,
Preveli
Lj
ilj ana
Iovanovii-
Stanisavlj
evii
IelenaVudiievii
Igor Marid
ffi
E
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 2/300
SaonZnt
Stale
novo
u drugom
izdanju
. . . . 2
Sta
se
nalazi
u drugom
tomu
oveknjige
........2
KakodoCido
drugogtoma...'...'....3
Preduslovi.
..
'....3
UdenjeC++-a.
...........3
Ciljevi.
...........4
Poglavlja
.........5
Zadaci ...........8
Relenja
zadataka...
.
.. ..
'.
'....
.
..
...8
Izvornik6d...
...........8
Standardijezika....
.....
'
9
Podr5kajeziku
............10
Prateiikompaktdisk......
.. .
.. I0
Kompakt
diskovi,
seminari
isavetovanja
....11
Gre5ke
.....
'.. '.11
Okoricama.
.....11
Dizajn
i
pripremaknjige.
. .
...
..12
Zahvalnice
......13
Razvojapstrakcije.
......16
Objekatimainterfejs
....18
Skrivenarealizacila.
.....19
Ponovna
upotreba
realizaciie
. . .20
Nasledivanje:
ponovna
upotrebainterfejsa.
.....2l
Relacije,je"i,,ie-kao"
.......24
Zamenljivi
objekti
i
polimorfizam....
.....25
Inicijalizacija
i uni5tavanje
objekata
........28
Obrada
izuzetaka:
radsgre5kama......
....29
Analizai
projektovanje
.
..
.
..
.
..30
FazaO:Pravimoplan
.....
...,....
..32
Faza
I: Stapravimo?.......'.........33
Faza 2:
Kako Cemo
izgraditi
sistem?
.35
Faza3:
Gradimoiezgro
......
..
-....38
Faza
4: Razvijamo
sludajeve
kori5denla
. ....
'..38
Faza5:Evolucija
.........
'.39
Planiranjese
ispIati.........
".......40
Ekstremno
programiranje
.
.'
.' .
41
Prvo sastavitetestove.........,....'.41
Programiranjeuparu....
..,.....,,,,42
Za5toC++uspeva
.......43
Bolji
C..
.... . . ..
..43
VeCstenauzlaznoj
liniji
.
.......
....44
Efikasnost
........44
Sisteme
je
laKe
opisati
i razumeti
.
. .
.44
Maksimalna
dobit
od biblioteka.
.. . .
.45
Ponovna
upotreba
izvornog
koda
uzlablone.
....
'. '45
Obrada
greSaka
.
'...
..
'....45
Programiranje
sloZenih
sistema
..'
..
.45
Strategije
unapredivanja.
. .
. . . .
. 46
Uputswa
......."46
TeSkoCeupravljanja
.....
............47
SaZetak
.........49
Postupakprevodenja
jezika.
. .
. . 52
Interpretatori
..............52
Prevodioci.
..........
"
'..53
Postupakprevodenja................53
Alatke
za
odvojeno
prevodenje.
.....55
Deklaracije
ili
definiciie.............'55
Povezivanje.
.............'59
Upotreba
biblioteka
.
. . .
.....
.
. .
.....60
VaSprviC++
program
....
......
61
Upotreba
klasa ulazno-izlaznih
tokova..
..........61
Imenskiprostori
.......
. .62
Osnorma
struktura
programa... ......63
,,Zdravo,
svete "
.. ...... ...il
Prevodenje
...
'...65
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 6/300
,i:
J..
:.tl
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 13/300
Misliti
na
ieziku
C++
porodica
Pollock,
Peter
Vinci,
porodica
Robbins, porodica
Moelters,
Dave
Stoner,
Laurie
Adams, porodica
Cransron,
Larry
Fogg,
Mike
i
Karen
Sequeira,
Gary Entsminger
i
Allison
Brody,
Kevin,
sonda i
Ella Donovan,
chester
i
stran-
non
Atrdersen,
Ioe
Lordi,
Dave
i
Brenda
Bartlett, porodica
Rentschler,
L1.nn
i
Todd i
njihove porodice.
I,
naravno,
moji
mama
i tata.
e
r,r'
,.:.
P,iogramski
jezici
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 30/300
.
:-:-*
.
:-;
ffi
ffi
ffi
S.I'
ffi
h
tu_
h
r'
t
&r
F
E
E
ffi
F
n
E
s
E,
[
H.
I
r
I
E
t
E
p
T
t
I
E
h
$
v,
$
I
r
j
2=
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 96/300
184
Misliti
na
jeziku
C++
21.
(.++
z.a
stnrkture aLltontatski pravi
definiciju
tipa
(ekvavilent
izrazatype-
def),
kao Sto ste videli
u ovom
poglavlju.
Isto
radi
i
za nabrojive
tipove
i
unije. NapiSite
mali
program
kojim
se
to
pokazuje.
22. Napravite
stek koji sadrZi
objekte tipa
Stash. Svaki
objekat tipa Stash
ie
sadrZati
pet
redova
iz
ulazne
datoteke.
Objekte
tipa
Stash napravite
pomoiu
operatora
new
Ueitajte datoteku
u
stek, a zatim
je
ispi5ite
tako
Sto
iete
ditati
redove iz steka.
t
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 97/300
23.lzmenite
zadatak 22:
spoljnu
struktura za stek
koji
sadrZi objekte
tipa
Stash. Korisnik moZe
da dodaje
i
uzima redove
samo
preko
funkcija dla-
nica,
ali struktura
u suStini koristi
stek objekata
tipa Stash.
24.
Napravite
strukturu
koja
sadrZi
podatak
tipa
int
i
pokazivad
na drugu
instancu iste
strukture. Napi5ite
funkciju
diji su argumenti
adresa
jedne
od
ovih struktura
i ceo
broj
koji
ukazuje
na
duZinu liste koju
hoiete
da
napravite.
Ova
lunkcija
treba da napravi
ceo lanac
struktura
(pouezanu
llsru),
poiev
od argumenta
(glaualiste),
pri
demu svaka
struktura
pokazuje
na
sledeiu.
Nove
strukture pravite
primenom
operatora
new
a
broj
(redni
broj objekta)
smestite u
podatak
tipa
int.
U
poslednjoj
strukturi liste
poka-
zivadu
dodelite vrednost
0, kako
bi
se
ukazalo
daje to
kraj. Napi5ite drugu
funkciju
diji
je
argument glava
liste
i
koje se
pomera
do
njenog kraja,
ispisujuii
za svaku strukturu
wednost
pokazivaea
i
celobrojnu vrednost.
25.
Ponovite zadatak
24,
ali funkcije
smestite
unutar
strukture, umesto
da
koristite
obidne
strukture
i
funkcije.
\.
it
..l.
:.r]$'
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 105/300
202
Misliti
na
jeziku
C++
14. Napravite
klasu
Stackoflnt
(stek
za
cele brojeve)
kori5ienjem
tehnike
,,Cheshire
cat".
'ia
tehnika skriva
strukturu
podataka niskog nivoa,
koju
koristite
za sme5tanje elemenata
u
klasu Stacklmp.
Realizujte
dve verzije
klase Stacklmp:
jednu
koja
koristi niz celih
brojeva
fiksne duZine,
i
drugu
koja koristi
vector<int>. U
prvoj
verziji ne morate
da brinete o
proSirivanju
niza,
jcr
ste unapred
zadali maksimalntr
veliiinu
steka. Obratite
paZnju
na
to
cla
klasa Stackoflnt.h
ne
mora
da
se
menja zajedno sa
Stacklmp.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 106/300
I
:
,i
t)
I
v'
6;
lr.ucrJALrzAcUA
I
ctscENJE
lJ,E''i
;
U,
poglavJig'4.s'tno
znaE4jtr'o,,tipapqg-dili
koriS(enie
biblioteke,'
jer
smo
r:iasrite
ktirnp.oletlgi'
uoli{aiene
bibliotg}ie
jgzifa,
C
skupili
i
tapsutirali'u'
strukturti
{apqtr,a]+4i,tip
podl3ka,
koji
iemo
odsad
zvatiklaia).'
''':
. ',
'
"
f:1
i:.i:.
''i:
.:.
MEI\,IOR
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 118/300
228
Misliti na
jeziku
C++
#i ncl ude
<i
ostream>
#i nc'l
ude
<cassert>
using namespace
std;
const
int increment
=
100;
Stash::Stash(int
sz)
{
>rze
-
5z;
quantitY
=
0;
next =
0;
storage
= 0;
i
Poglavlje
7:
Preklapanje
funkcija i
podrazumevani
argumenti 229
int
Stash::count0
(
return next;
//
Broj
elemenata
)
void
Stash:
:inflate(int
increase)
{
assert
(i
ncrease
,=
0)
;
if(increase
==
0)
return;
'int
newQuantily
= quantity
+
increasel
int neviBytes
=
newQuantity
*
sjzel
int oldBytes
=
quantity
*
srze;
unsigned char*
b
=
new unsigned char[newBytes];
<
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 119/300
Stash::Stash(int
sz, int initQuantity)
{
si
ze
=
sz;
quanti
ty
=
0;
next
=
0;
storage
= 0;
i
nf1
ate
(
i ni
tQuanti
ty)
;
I
Stash::-Stash0
{
if(storase
=
0)
{
cout
<<
"os1
obadjam
memoriju"
<.
endl
;
de1
ete
[]
storage;
i
)
int
Stash::add(void*
element)
{
i f(next
>=
quanti
ty)
I
I
Da 1
i je
ostaio
dovoljno
prostora?
inflate(increment);
II
Kopira
eiemente u skladi5te,
ll
poe;njuei
od sledeceg
praznog prostora:
int
startBytes
=
next
*
size;
unsi
gned
char"
e
=
(unsi
gned
char*) e1 ement;
for(int
i =
0;
i
<
size; i++)
storageIstartBytes
+
i]
= eIi];
next++;
return(next
-
t);
l/
Indeksni broj
)
voi
d*
Stash :
:
fetch
(
i nt i ndex)
{
require(0
<=
index,
"stash::fetch
(-)index");
i
f(i
ndex
>=
next)
return
0;
f f
Za ozna(.avanje kraja
I I
Pravi
pokazi
vad na
el ement:
return
&(storageIindex
*
size]
);
I
for(int
i
=
0;
i
oldBytes;
i++)
b[i]
=
storagell);
//
Kopira stari
blok
u
novi
del ete
[]
(storage)
;
//
0sl
obada
staro
skl adi 5te
storage
=
6;
//
Pokazuje na novi memorijski blok
quantjty
=
newQuantity;
//
Podeiava
velidinu
\
l//,-
Prvi
konstruktor ne
zauzima
memoriju
za
pokazival
storage.
Memorija
se
zavzimatek kada
prvi put
dodate objekat, funkcijom
add(
),
kao i svaki
put
kada
se
prepuni
tekuie skladi5te.
Oba
konstruktora
su
upotrebljena
u
probnom programu:
/ /
: C07 :Stash3Test.cpp
//{L)
Stasna
/ I
Preklapanje funkcija
#i ncl ude
"Stash3.
h"
#incl ude
"../requi
re.h"
#i ncl ude
<fstream>
#i ncl ude
<i
ostream>
#include
<string>
using namespace
std;
int mainO
{
Stash
i ntStash
(si
zeof(i nt)
) ;
for(int
i
=
0;
i
<
100; i++)
i ntStash.
add
(&i
)
;
for(int
j
= 0;
j
<
intStash.count0;
j++)
cout
<<
"intStash.fetch("
.. j ..
")
=
"
<<
*(
int*)
intStash.fetch(j)
<<
endl;
const
int
bufsize
=
B0;
Stash stringstash(sizeof(char)
*
bufsize,
100)
i
i fstream in("Stash3Test,cpp")
;
assure(in,
"Stash3Test.cpp")
;
string line;
whi
1 e(get1
ine(in,
I ine)
)
stringStash.add(
(char*)
l
ine.c
str0)
;
intk=0;
char*
cpl
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 124/300
240
Misliti
na
jeziku
C++
3. Lltwdite
kako
vas
prevodiiac
moZe
da
napravi
asemblerski
prevod i ekspe-
rimentiSite
da
biste
utwdili
Semu
za obeleZavanje
imena'
4. Napravite
klasu
s detiri
funkcije
dlanice,
koje
imaju
0,
1,2
i 3
celobrojna
argumenta.
Napisite
glavni
program
koji
pravi objekat
te
klase
i
poziva
.rik,
funk.i;u
8lanicu.
Sada
izmenite
klasu
tako
da ima
samo
jednu
funk-
ciju
dlanicu
diji
su
svi argrtmenti
podrazumevani.
Da
li ovo
menja
vas
glavni
program?
5.
Napravite
funkciju
s dva
argumenta
ipozovite
je
iz
glavnog
programa'
Zaiim od
jednog
argumenta
napravite
laZni argument
(bez
identifikatora)
i
pogledaite da
li se
menja
poziv u
glavnom
programu.
6.
Izmenite
datoteke
Stash3.h
i
Stash3.cpp
da
biste
upotrebili
podrazume-
vane argumente
u
konstruktoru.
Testirajte
konstruktor
praveii
dve
razli-
i
;1.
l'
r'
.i,i
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 125/300
dite
verzije
objekta
dinamidkog
niza.
7.
Napravite
nor,u
verziju
klase steka
(iz
poglavlja
6),
koja
sadrZi
podrazume-
vani konstruktor,
kao
i ranije,
i
ios
jedan
konstruktor
koji ima
sledece
argu-
mente:
niz
pokazivada
na objekte
i
velidinu
tog
niza. Ovaj
konstruktor
bi
trebalo
da se
kreie
krozoiz
i
stavlja
svaki
pokazivad
na stek.
Testirajte
vasu
klasu
pomoiu
niza
podataka tipa
string.
8.
Izmenite
promenljivu
SuperVar
tako
da se
komandom
#ifdef
obuhvati
kod
u kome
se
koristi
vartlpe,
kao Sto
smo
objasnili
razmatrajuii
nabrojivi
tip.
Od
vartype
napravite
regularnu
i
javnu
nabrojir,u
listu
(bez
instanci)
i
izme-
nite funkciju
printO tako
da
zahteva
argument
tipa
vartype
da
bi
znala
sta
da
uradi.
9.
Realizujte
Mem2.h
tako
da
izmenjena
klasa
i
dalje
radi
s
datotekom
MemTest.cpp.
10.
Iskoristite
klasu
Mem
za
realizaciju
dinamidkog
niza.
Posto
je
realizacija
privatna,
znadi skrivena od
klijenta,
probni
kdd
ne
mora
da
se
menja'
I l.
U
klasi
Mem
dodajte
funkciju
ilanicu
movedO
koja
na osnovu
rezultata
funkcije
pointerO
govori da
li
se
pokazivad
pomerio
(usled
naknadnog
dode-
ljivanja
memorije).
Napisite
glavni
program koji testira
funkciju
moved0.
Da
Ii
ima
vise smisla
da
koristite
funkciju
movedO,
ili da
pozivate funkciiu
pointer0
svaki
put
kada
treba da
pristupite memoriji
u
klasi
Mem?
..i'r'ii'::
'i.'
1
.
Lt
i,
Ir'
]/
lr'
1,.'
I
i':
'
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 141/300
Efikasnost
je
jedna
odvaZnihkq,rak(e.dptikp-kojujg C++
nasledio
od
jezika
C.
Da C++
nije
tako'delowo,ran,
rnndgi
programeri
ne
bi
ni
koristili
taj
jezik.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 153/300
. ,/jr.1-r
"f
.."
'i:..',.'.''',
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 154/300
/
1;'..
1....r, i.:,i:"-.
.,
;
i.
i
r
1:r
i)
.r
:-t
::..,:i,
-i :.'** 'rl
1'
,
t'::l.id.*.1"'l:.
:.'
-
"
'
.;
j:'
,"':,,
-.
:'
'
I
.
;
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 170/300
330
Misliti
na
jeziku
C++
3
I . Naprarrite
klasu
koja
predstavlia
vezu
sa Stampadem
i
koja
dozvoljava
da
imate
santo
iedan
StamPad.
3
2. U datoteci
zaglavlja,
napravite
klasu
Mirror
ko a sadrzi
dva
podatka
dlana:
pokazivad na objekat
klase
Mirror
i dlan
tipa
bool.
Dodaite
i
dva
konstruk-
iora,
podrazumevani
konstruktor
koji
inicijalizuje
logidki
dlan
wednosiu
true,
a
pokazivad
nulom.
Drugi
konstruktor
ima
argument
tipa
Mirror
*,
koji dodeljuje
internom
pokazivaeu, a dlanu
tipa
bool
dodeljuje
wednost
false. Dodajte
funkciju
dlanicu
testo.
Kada
pokazivad
na objekat
nema
wednost
nula onda
waia
wednost
funkciie
test(
)
koja
je
pozvana
preko
pokazivada.
Ako
pokazivad ima
wednost
nula,
na vrednost
dlana
tipa bool.
bada
napravire
per
cpp datoteka
tako
da
svaka
ukljuduie
zaglavlje
klase
Mirror.
Prva cpp
datoteka
deflnise
globalni objekat
klase
Mirror
upotre-
bom
podrazumevanog
konstruktora.
Druga
datoteka
deklarise
objekat
u
prvoj datoteci
kao spoljni
i deflnise
globalni objekat
klase
Mirror
upotle-
Lom-drugog
konstruktora,
s
pokazivaeem
na
prvi
objekat.
Nastavite
ovako
dok
ne
riign"t.
do
poslednje datoteke
koja
ie
takode
sadrZati
definiciju
globalnog
objekta.
U toj
datoteci,
glavni
program
treba
da
pozove funkciju
Iest(
)
i
ispise
rezultat.
Ako
je
rezultat
true,
menjajte
redosled
povezivanja
t
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 171/300
sve
dok
ne
dobijete rezultat
false.
33.
Otklonite
problem
u
veZbi
32
koristeii
prvu tehniku
prikazanu
u
ovoi
knjizi.
34.
Otklonite
problem
u
veZbi
32
koristeii
drugu
tehniku
prikazanu
u
ovoj
knjizi.
35.
Ne
ukljuduiuii
datoteku
zaglavlja,
deklarisite
funkciju
putso iz stan-
dardne
biblioteke
jezika
c.
Pozovite
or,u
funkciju
iz
glavnog
programa.
Reference
su,kao
r
konstantni
pokazivadi
koje,prevodilac
automat
-
ski
dereferencira.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 183/300
Misliti
na
jeziku
C++
356
25
26
NapraviteklasukojasadrTinizcelobrojnihvrednosti.DalimoZetedadode.
liteindeksnebroieveilanovimanizaupotrebompokazivaeanadlanove?
Iz-menite
clatoteku
PmemFunDefinition'cpp
dodavanjem
preklopljene
ftrnkcije
elanice
f(
)
(moZete
da
utwdite
listu
argumenata
toja
Ce
\zazvati
freklapanie).
Sada
napravite
drugi
pokazivai
na
dlan'
dodelite
ga preklo-
i,ii.r"ir.iriri
funkciie
f(
),
i
pozovitl
tunkciiu
preko
tog
pokazivada'
Kako
se
ovde
razre5ava
PreklaPanje?
2
7.
Poinite
s datotekom
FunctionTable'cpp
iz
poglavlja
3'
Napravitetlasu
koia
sadrZivektorpokazivadanafunkcije.I{asatakodetrebadasadrZifunkcije
dlaniceadd()iremove()kojesluZezadodavanjeiuklanjanjepokazivada
na
funkciie.
Dodajte
i funkiiju
run(
)
koia
se
kreie
kroz
vektor
i
redom
poziva
sve
funkciie'
28.IzmenitereSenjevelbe2Ttakodaradispokazivadimanafunkcijedlanice.
l,r
l,:,
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 184/300
iit,
$t.
i-.,
j-.
i ','
it
..
I,
l:
II
t'.
L.
["
i
i".'
i'
i"
;r
I
Ii
t
t.,
l\
,I2:
PREKLAPANJE
oPERAToRA
:'
i
Preklapanje
operatora
je
samo
,,sintaksna
poslastica',
Sto
znadi
da
i
je
to
joS
jedan
nadin zapoz.walje
funkcije.
I
I
I
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 186/300
362
Misliti
na
jeziku
C++
return
a;
)
I I
Suft
ksna
verzija
vraca
vrednost
pre
umanienia:
const
Integer operator--(lnteger&
a,
int)
(
cout
<<
"
lnteger--\n";
Integer
before(a.i);
a.i--;
return before;
I
//
Pokazacemo da
preklopljeni
operatori
rade:
void
f(lnteger
a)
{
+a;
-o;
-a;
Integer*
ip
=
&a;
la;
++d
i
a++;
Poglavlje
I
2:
Preklapanje
operatora
363
//
Funkcije
dlanice nisu
konstantne, pa
mogu imati
sporedne
efekte:
const
Byte&
operator++0
|
//
pretiksna
verzija
cout
<<
"++Byte\n,,;
b++;
return
*this;
)
const
Byte
operator++(intl
I
l/
Suf.iksna
verzija
cout
<<
"Byte++\n";
Byte
before(b);
b++;
return
before;
)
const
Byte&
operator--0
{
/l
prefiksna
verzija
cout
<<
"--Byte\n";
--b;
return
*thi
s;
)
const
Byte
operator--(int)
I
/l
Sufiksna verzija
cout
<<
"Byte--\n";
Byte before(b);
-
-b;
return
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 187/300
)
//
Funkci3e
clan'ice
(podrazumeva
se argument "this"):
class
Byte
{
unsigned char
b;
publ
i
c:
Byte(unsigned char
bb
=
0)
:
b(bb)
{)
//
Nema
sporednih
efekata:
konstantne
funkciie
ilanice:
const
Byte&
operator+0 const
{
cout
<<
"+Byte\n";
return
*thi
s;
)
const
Byte
operator-0
const
(
cout
<<
"-Byte\n"
I
return Byte(-b);
i
const
Byte operator-0
const
{
cout
<<
"-Byte\n";
return
Byte(-b)
;
i
Byte operator
0
const
{
cout
<<
" Byte\n";
return
Byte
(
b)
;
)
Byte*
operator&0
{
cout
<<
"&Byte\n";
return
thi s;
)
before;
)
);
void
g(Byte
b)
{
+b;
-b;
-b;
BYte*
bP
=
96'
b;
++b;
b++;
- -b;
b--;
)
int
mainfl
{
Integer
a;
f(a);
Byte
b;
g(b);
\
///:-
,
ove
funkcije
su
grupisane
na
osnovu
nadina
prosledivanja
argumenata.
Kasnije
cemo
navesti
smernice
za
prosledivanje
i waianje
argrr-e.rit".
uglur-
nom
iete
koristiti
tehnike
iz
prethodnog
primera
(kao
i one
koji
iete videti
u
sle-
decem
odeljku).
Neka
vam
one
posluZe
kao sablon
kada preklapate
operatore.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 188/300
366
Misliti
na
jeziku
C++
//
Uslovni
operatori
vracaiu
vrednosti
true
ili
false:
frr
end
i nt
operator==
(const
I
nteger&
I
eft,
const
Integer&
ri
ght)
;
fri
end
i
nt
operator =(const
Integer&
1eft,
const
Integer&
right);
f
ri
end
'i
nt
operator<(const
Integer&
1eft,
const
Integer&
right);
friend
int
operator>
(const
Integer&
1
eft,
const
Integer&
right);
fri end
i
nt
operaton<=(const
Integer&
left,
const-
Integer&
right)
;
fri
end
I
nt
operator>=
(const
I
nteger&
i
eft,
const
Integer&
right)
;
fri
end
i
nt
operator&&(const
Integer&
1eft,
const
I
nteger&
ri
ght)
;
Poglavlje
I
2:
Preklapanje
operatora
6V
const
Integer
operator*(const
Integer&
1eft,
const
Integer&
right)
{
return
Integer(1eft.i
*
right.i);
)
const Integer
operator/(const
Integer&
1eft,
const
Integer&
right)
{
require(right.i
=
0,
."deljenje
s
nu1om,,);
return
Integer(1eft.i
/
rlght.i);
)
const
Integer
operator%(const
Integer&
left,
const
Integer&
right)
{
require(right,i
=
0,
"ostatak
pri
deljenju
s
nu1om,,);
return
Integer(1
eft. i
% r1
ght.
i
) ;
i
const
Integer
operator^(const
Integer&
1eft,
const Integer&
right)
(
return
Integer(1eft.i
^
right.i);
)
t
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 189/300
fri
end
i
nt
operatorl
I
(const
Integer&
1eft,
const
Integer&
right);
II
lsptsuje
sadrZaj
u
iz1azni
tok:
void
print(std::ostream& os)
const
{
os
'<
i;
)
);
#endif
ll
INTEGER_H
///:-
I I
: CI?:lnteger.cPP
{0i
I I
Realizaci
ja
preklopl
jenih
operatora
#include
"Integer.h"
#include
". ./require.h"
const
Integer
operator+(const
Integer&
left,
const
Integer&
right)
{
return
Integer(left.i
+
right.i);
)
const
I
nteger
operator-
(const
I
nteger&
I
eft,
const
Integer&
right)
{
return Integer(left.i
-
right.i);
)
const
Integer
operator&(const
Integer&
1eft,
const
Integer&
right)
{
return
Integer(1eft.i
&
right.i);
)
const
Integer
operatorl
(const
Integer&
left,
const
Integer&
rlght)
(
return
Integer(1eft.i
I
right.i);
)
const
Integer
operator<<(const
Integer&
1
eft,
const
Integer&
right)
{
return
Integer(1eft.i
<<
right"i)
;
)
const Integer
operator>>(const
Integer&
1eft,
const
Integer&
right)
{
return
Integer(1eft.i
>>
right.i)
;
]
//
Operatori
dodele
menjaju
i
vracaju
lvrednost:
Integer&
operator+=(lnteger&
1
eft,
const
Integer&
rjght)
{
if(&left
==
&right)
{/*
dodela
vrednosti
istom
objektu
*/)
I
eft.'i
+=
ri
ght.
i
;
return
left;
)
Misliti
na
jeziku
C++
358
I
nteser&
o,erator-=,
::::?.i:,[::i
if(&left
==
&right)
{/*
dodela
left.i
-=
right.i;
return
1
eft;
i
Inteqer&
operator*=(lnteger&
left'
const
lnteger&
i f
(&l
eft
== &ri
ght)
{
/*
dodel
a
I
eft.
i
*=
ri
ght.
i
;
return
1 eft;
ri
qht)
(
vrednosti
i stom
objektu
*/)
ri
sht)
(
vrednosti
i stom
objektu
*/)
I
rnteser&
operator/=,::::?.;:,[:li
.,ni,l
r
require(right.i
l=
0,
"deljenie
s
nulom");
liiar.ri
==
a.isl,t) {7.
ooo.ta
vrednosti
istom
obiektu
*/)
1
eft.
i
/=
ri
ght. i
;
return
1
eft;
)
Inteser&
operator%=,::::?.;:.[:li
.,nn,,,
require(right.i
l= 0,
"ostatak
pri
delieniu
s
nulom");
*/)
Poglavlje
I
2:
Preklapanje
operatora
369
return
I
eft;
)
Integer&
operator<<=
(
integer&
1
eft,
const
I nteger&
ri
ght
)
{
if(&1eft
==
&riSht)
{/*
dodela
vrednosti
istom
obiektu
*/}
I
eft.
i
<<=
ri
ght.
i
;
return 1
eft;
)
//
Uslovni
operatori
i
nt
operator==
(const
const
return
Ieft.i
==
)
i nt operator =
(const
cons
t
return
Ieft.i =
I
i
nt
operator<
(const
I
nteger&
I
eft,
const
Integer&
right)
i
return
left.1
<
right.j;
)
j
nt operator>(const
Integer&
I
eft,
const
Integer&
right)
vracaju
vrednost
true
ili false:
Integer&
left,
Integer&
right)
{
ri
ght.
i
;
Integer&
1eft,
Integer&
right)
{
ri
ght.
j
;
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 190/300
const
I
nteger&
if(&left
==
&right)
{/*
dodela
1eft.i
l=
right.i;
return
1
eft;
ri
ght)
{
vrednosti
i
stom
risht)
{
vrednosti
istom
objektu
*/]
I
riAl.fi ==
f.lsl,t)
{/"
dodela
vrednosti
istom
objektu
I
eft.
i
%=
ri
ght. i
;
return
1 eft;
)
rnteser&
operator^=,:::::.;:,[:li
.,nn,,,
if(&left
==
&right)
{/*
dodela
vrednosti
istom
objektu
"/}
left.i
^=
right'i;
return
I
eft;
)
I
nteger&
operator&=
(
I
nteger&
I
eft
'
const
I
nteger&
i
f(&left
-=
&right)
{/*
dodela
left.i
&=
right'i;
return
I
eft;
)
Integer&
operator]
=(lnteger&
left'
objektu
*/)
)
rnteser&
operator>>=(rllii.ilrlill;
right)
{
if(&left
==
&rjght)
i/*
dodela
vrednosti
istom
objektu
I
eft.
i
>>=
ri
ght. i
;
*
l\
i
return
Ieft.i
>
right.i;
)
i
nt
operator<=
(const
Integer&
1
eft,
const Integer&
right)
{
return
I eft.
i
<=
ri
ght.
i
;
)
j
nt operator>=
(const
Integer&
1
eft,
const
Integer&
rlght)
{
return
left.i
>=
right.i;
)
'int
operator&&(const
Integer&
left,
const
Integer&
right)
{
return
I
eft.
i
&&
ri
ght.
i
;
)
int operatorl
I
(const
Integer&
1eft,
const
Integer&
right)
{
return left.i
ll
right.i;
)
//
/,-
/
I
z CLZIIntegerTest.cpp
//{
L}
Inteser
#include "lnteger.h"
#i ncl
ude
<fstream>
using
namespace std;
ofstream
out("lntegerTest.out")
;
t70
Misliti
na
jeziku
C++
void
h(lnteqer&
c1,
lnteger&
c2)
{
//
S1 oZen
i
zraz:
cI+=cl*c2+c2%cl;
#defr
ne
TRY
(0P)
\
out
<<,,C1
=,,;
cl.print(OUt);
\
out
<<
"
,
cZ
=
";
c2.Print(out);
\
out
<<
"; c1
"
#OP
"
c2
daie
";
\
(ct
0P
c2).Print(out);
\
out
<<
endl;
TRY(+)
TRY(-)
TRY(.)
TRY(/)
TRY
(%)
TRY
(^)
TRY
(&)
TRY
(
|
)
TRY(<<)
TRY(>,)
IRY(+=)
TRY(-=)
TRY(*=)
rRY(/=)
TRY(%=)
TRY(^=)
TRy(&=)
TRY(
|
=)
TRY(>>=)
TRY(<<=)
//
Uslovni
oPeratorj:
#define
TRYC(0P)
\
out
<<
,,c1
=
',;
cl.print(out);
\
out
<<
,,
,
cZ
=
"; c2.print(out);
\
out
<<
";
c1
"
#0P
" c2
daie
";
\
oul
<< (c1
0P
c2);
\
out
<<
endl;
TRYC(<)
TRYC(>)
TRYc(==)
TRYc(
l=)
rRYC(<=)
Poglavlje
I
2:
Preklapanje
operatora
371
const
Byte
operator-(const
Byte&
right)
const
{
return
Byte(b
-
ri
ght.
b)
;
)
const
Byte
operator*(const
Byte&
right)
const
{
return
Byte(b
*
right.b);
i
const
Byte
operator/(const
Byte&
right)
const
{
require(right.b
l=
0,
,,deljenje
s
nulom");
return
Byte(b
/
right.b);
)
const
Byte
operator%(const
Byte&
right)
const
{
require(right.b
l=
0,
,,ostatak
pri
deljenju
s nu1om,,);
return
Byte(b
%
right.b);
)
const
Byte
operator.'(const
Byte&
right)
const
{
return
Byte(b
^
rjght.b);
)
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 191/300
TRYC(>=)
TRYC(&&)
rRYC(
I
I
)
)
int
majn0
{
cout
<<
"funkcije
priiatelJi
"
"
endl;
Integer
cl(a7),
c2(9);
h(c1,
c2);
\
I
ll,-
I
I
: C12:
Byte.
h
I
I
Preklopljeni
operatori
ilanovi
#
i
fndef
BYTE_H
#defi
ne
BYTE_H
#include
". ./requrre.h"
#i
ncl ude
<i
ostream>
//
Funkcije
alanice
(podrazumeva se arqument
"this"):
class
Byte
{
uns
i
gned
char
b;
publ
i c:
Byte(unsigned
char
bb =
0)
:
b(bb)
{}
//
Nema sporedni
h
efekata:
konstantne
funkci
j
e
dl ani
ce:
const
Byte
operator+
(const
Byte&
ri
ght)
const
{
return
BYte(b
+
right.b);
)
const
Byte
operator&(const
Byte&
right)
const
{
return
Byte(b
& right.b);
)
const
Byte
operatorl
(const
Byte&
right)
const
i
return
Byte(b
I
right"b);
)
const
Byte
operator<<(const
Byte&
right)
const
{
return
Byte(b
<<
right.b);
)
const
Byte
operator>>(const
Byte&
right)
const
{
return
Byte(b
>>
right.b);
)
//
0peratori
dodele
menjaju
i vraeaju
lvrednost.
ff
operator
dodele
moZe
biti
samo
funkcija
dlanica:
Byte&
operator=(const
Byte&
r.ight)
i
//
Proveravamo
dodeljivanje
vrednosti
istom
objektu:
if(this
==
&riSht)
return
*th.is;
b
=
right.b;
return
*thi
s;
)
Misliti
na
jeziku
C++
372
Byte&
operatop+=
(6onst Byte&
ri
ght)
(
"',ii,iis
==
&righl)
{/.
dodela
vrednosti
istom
objektu
*/}
b
+=
rioht.b;
return
"thi
s
i
S\ie-\
Lrperator-=(const
Byte&
rrght)
1
if(this
==
&risht)
i/.
dodela
vrednosti
istom
objektu
*/)
b
-=
ri
ght. b;
return
*thi
s;
)
Byte&
operato,'"=
(const
Byte&
ri
ght)
{
if(th;s
==
&right)
{/*
dodela
vrednosti
istom
obiektu
*/}
b
-=
right.b;
return
-this;
i
Byte&
operatorl=
(const
Byte&
ri
ght)
{
require(right.b
l=
0,
"delienie
s
nu1om");
rf(this
==
&rrght)
i/*
dodela
vrednosti
istom
objektu
*/)
b
/=
right.b;
return
*thi
s;
)
Byte&
operatop2=
(const
Byte&
ri
ght)
{
l=
0,
"ostatak
pri
delieniu
s
nulom")
i
Poglavlje
I
2:
Preklapanje
operatora
373
Byte&
operator<<=(const
Byte&
right)
{
if(this
==
&right)
{/*
dodela vrednosti
istom
objektu
*/)
b
<<=
right.b.
return
*thi
s;
)
//
Uslovni
operatori
vracaju
vrednost
true
ili
false:
int
operator==(const
Byte&
right)
const
{
return
b
==
right.b;
)
int
operator =(const
Byte& right)
const
{
return
b
= right.b;
)
int
operator<(const
Byte& right)
const
{
return
b
<
right.b;
)
int operator>(const
Byte&
right) const
{
return b
>
right.b;
)
int operator<=(const
Byte&
right) const
{
return
b
<=
right.b;
)
int
operator>=(const
Byte&
r'ight)
const
{
return
b
>=
right.b;
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 192/300
require(right.b
ifitnis
==
&right)
{/*
dodela
vrednosti
istom
objektu
*/)
b
%=
right.b;
return
*thi
s;
I
Byte&
operatop^=
(const
Byte&
ri
ght)
(
if(thjs
==
&right)
{/*
dodela
vrednosti
istom
obiektu
b
^=
rj
ght.
b;
return
*thi
s;
)
Byte&
operatopg=
(const
Byte&
ri
ght)
(
if(thls
==
&right)
{/*
dodela
vrednosti
istom
obiektu
b &=
right.b;
return
*thi
s;
l
Byte&
operator]=(const
Byte&
right)
{
if(this
==
&riSht)
(/-
dodela
vrednosti
istom
objektu
b
l=
right.b;
return
*thi
s;
)
Byte&
operatop>>=(const
Byte&
right)
{
if(this
==
&right)
{/*
dodela
vrednosti
istom
objektu
b
>>=
ri
ght
.
b'
return
*thi
s;
I
-
ll
-
ll
-
ll
*
lJ
)
int operator&&(const
Byte& right)
const
(
return b &&
right.b;
)
int operatorl
|
(const
Byte&
right) const
(
return
b
ll
right.b;
)
//
Ispisuje
sadrZai
u
jzlazni
tok:
void
print(std::ostream& os) const
{
os
<<
"0x"
<<
std::hex
<<
int(b)
<<
std::dec;
)
);
#endit
/l
B\TE_H
///:-
//:
Cl?tBytelest.cpp
#include
"Byte.h"
#i ncl ude
<fstream>
using
namespace
std;
ofstream out
("ByteTest.out"
)
;
void
k(Byte& bl,
Byte&
b2)
(
b1=bl*b2+b2%bll
#define
TRY2(0P)
\
out
<<,,b1
=,,;
bl.print(out);
\
out
<<
",
b2
= '';
b2.Print(out)
I
\
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 209/300
ll
I
i:
'
i
i,'
\..
\';.
l
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 210/300
l'r
..-
1"r..
t
1(i
;
lf.:
t.\
'
I
ri.
t-
I\I
L'
lt
i-
i'
{
ir
E:
I
Drrunrtnero
STvARANJE
OBJEKATA
Nekad tadno znate
kolidinu, tip
i
rok trajanja
objekata
u
svom
pro-
gramu.
Ali
ne
uvek...
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 222/300
434
Misliti
na
jeziku
C++
l4
Napravite
klasu
sa
namenskim oparatorom new,
diji
ie
argument
tipa
,tri.rg.
Klasa
bi
trebalo
da sadrZi
static
vector<string>,
gde se smesta
drugi
argument
operatora
new.
U
funkciii
main(
)
pozovite
namenski
operator
new
sa argumentima
koii
opisuiu
taj
poziv
(mogli
biste
da
iskoristite
pret-
procesorske
makroe
FIt-E
iLINE)'
Prc racii
t
e
progra ltt ArrayOperatorNew.cpp
dodavani
em
stati'kog
vektora,
pokaz.ivaia
tipa
widge*.
operator
new
treba
da
u tai
vektor
upise
adresu
irovog
objekti,
u
,',p.rutnI.
delete
treba
da
obrise
adresu
obiekta
iz vektora
(vise
informacija
o
vektorima
potraZite
u
dokumentaciji
biblioteke
ili
u
clrugom
tomtr
knjige).
Napravite
i
drugu klasu
MemoryChecker,
iiji
desii.ktor
prikazuje broi
pokazivada
u
vektoru.
Napravite
program
sajed-
norn
globainom
instancom
klase
MemoryChecker
i u
funkciji
maing,
dinariiaki
napravite
i uni5tite
nekoliko
objekata
i
nizova
tipa
widget.
PokaT-ite
cla MemoryChecker
otkriva
curenje
memorije'
t5
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 223/300
I 4=
NnsLrDlVANle,'l
SLAGANJE
Pono\mo
koriScenje
kod3
je
jedna
od
najnapredni.lih rnoguinosri
C++-a,
ali
ako zaista Zelite
da
postanete
programer,
moriiete da
naudite
mnogo
vi5e
od
jednostivnog
kopiianja i menjanja.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 241/300
Misliti
na
jeziku
C++
468
ltrnkcijeilarriccklaselProrytrebasamodapozivajuodgovarajuiefunkcije
prekopokazivaCanaklasu'subiect.ArgumentkonstruktorazaklasuProxy
1rokaz.i,,ai,
je
na
klastr
Subiect,
koji
se
ugraduje
u
objekat.
klase
Prory
iobicno
r.r konstftrktor).
U
{'unkci;i
maino
napravite
dva
razlidita
obiekta
tipa
Proxy,
ktljiktlristc
clve
raz-lidite
realizacije.
Zal\m,
izmenite
klasu
Prory
tako
da
tttoZete
dinanlicki
menjati
realizaciie'
2 8.
lzrnenite
program
ArrayoperatorNew'cpp
iz
poglavlja
I3 da
biste
pokazali
--
tofo,
u1.,rlos'nasleaivanlu,
dodela
idalJe
ispramo
funkcioni5e-
Objasnite
za5to
rrasleclivatlje
tt
prog.urn,
Framis'cpp
iz
poglavlja
13
ne
bi
funkcio-
nisalo.
29.
lzn'renite program
Framis'cpp
iz
poglavlja
I3'
izvodeniem klase
iz
klase
Framis
u
koioi
iete
napraviti
nove
veizije
operatora
new
i delete.
Pokazite
da
nova
klasa
radi
isPravno'
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 242/300
I
5:
PoIIMORFIZAM I
VIRTUELNE
FUN.KCUE
,
,
Polimorfizam
je,
pored
ap.gtrakcija,lpodataka
i
nasledivanja, treie
osnovno
svoi
stvo
obj
ektno
orijentisanih
p
ro
gramskih
j
ezika.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 244/300
474
Misliti
na
leziku
C++
ProS
irivost
Poiro
je
frrnkcija
play(
)
rr
osnovnoj
klasi clcfinisana
kao
virtuelna,
moZete doda'
vatt
koliko
gorl
hoictc
por,ilt
tiltgva
nc
rnenjajtlii
ftrnkciju
tuneO.
tJ dobro
pro-
jcktovanonr
ob
jcktrto
orijt rrtisanrrrn
prograrnu,
rnoclel
veiine
ftrnkciia biie
nalik
lra tune(
)
i konrrrnicirait:
sarno
sa intcrfejsonl
osnovnc
klase.
Takav
program
je
proiirit',1toSto
sistctttu rnoZcte
clodavati
ftrnkcir:nalnost
izvodeii
nove tipove
podataka iz zajcclnicke
osnovrre
klase.
Irrrnkcije
koie
rade
s
interfejsom
osnol'ne
klase rrol.ritc
ne
lrorate
nreniati da
bi se
pritagodile novim klasama.
Prethoclnont
printenr
str clocleite
virtuelne
lunkcije
i nove klase
i
sve
ispravno
racic sa staron-I,
treprontcnjenorn
funkcijom
tune(
):
I
I
:
C15:
Instrument4.cPP
I
I
Pro\i rivost u 00P-u
{i ncl ude
<i
ostream>
us
i
ng namespace s td
;
enurf
note
{
mi
dd1
eC, Csharp,
Cfl
at
}
;
I I
ltd
"
class
Instrument
i
publ
i
c:
virtual
void
play(note)
const
{
cout
<<
" I nstrument:
:
P1
aY"
<<
endl
;
)
vr
rtual
char*
what
0
const
{
return
"
Instrument"
I
)
//
Pretpostavimo da ce ova
funkcija
izmenit'i objekat:
virtual vord
adjust(int)
{}
);
class
tiind
:
public
Instrument
{
Poglavlje
I
5:
Polimorfizam
i
virtuelne
funkcije
475
voi
d
p1
ay
(
note)
const
{
cout
<<
"Stri
nged:
: p1
ay"
<<
endl
.
)
char*
what0
const
{
return
"Stri
nged";
}
void
adjust(int)
()
);
class Brass
:
public
Wind
i
publ
i
c:
void
play(note)
const
{
cout
<<
"Brass:
:
p1
ay"
<<
endl
.
)
char*
what0
const
{
return
"Brass";
}
l.
cl ass Woodwi
nd :
publ
i
c
l,li nd
{
publ
i c:
void
play(note)
const
{
cout
<<
"Woodwi
nd:
:
pi
ay"
<<
endl
.
)
char*
what0
const
{
return
"Woodwind";
)
I.
//
Istovetna
funkcija
kao
ranije:
void
tune(lnstrument&
i)
(
i.p1ay(middleC);
I
/
/
Nova funkcija:
void
f(lnstrument&
i)
{
i.adjust(1);
}
t
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 245/300
publ
r
c:
vord
play(note) const
{
cout
<<
"l^/ind: :
pl
ay"
..
endl
'
)
char*
what
0
const
{
return "14i
nd"
r
}
vord
adjusl(int)
{ )
);
class
Percussion
:
public
Instrument
i
p-01
c:
voi
d
p1
ay
(note)
const
{
cout
<<
"Percussi on:
:
p1
ay"
<.
endl
;
)
char*
what0
const
(
return
"Percussion
void
adjust(rnt)
{ )
t;
cl
ass Stri
nged
:
publ
i
c
Instrument
{
publ i
c:
;i
//
Svodenje
navi5e
tokom
inicijalizacije
niza:
Instrument*
Atl
=
{
new l,ii nd,
new
Percussion,
new
Stri nged,
new
Brass,
);
int
main0
{
Wi nd
fl
ute;
Percussi
on
drum;
Stri nged vi
ol i n;
Brass fl
ugel horn;
Woodwi
nd
recorder;
tune(flute);
tune
(drum)
;
tune
(vi
ol
j
n)
;
tune
(fl
ugel horn)
;
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 249/300
484
Misliti
na
jeziku
C++
Za
deklarisanic
potpuno
virtuelne
funkciie
koristi
se
sintaksa:
r0
0;
In
stru
ment
virtual
void
PlaY0
virtual
char*
whato
virtual
void
adjustQ
Percussion
void
plaYo
charx
what(
)
void
adjusto
void
Playo
ch
ar*
what(
)
void
adjust0
void
plaY(
)
charx
what0
void
adjusto
Woodwind
void
plaY(
)
char*
whato
oid
playo
charx
whato
Poglavlje
l5: Polimorfizam
i virtuelne
funkcije
485
class
Instrument
(
publ i
c:
/l
Potpuno virtuelne
funkcije:
virtual
vojd
play(note)
const =
0;
vjrtual char*
what0
const =
0;
//
Pretpostavlja se
da ce ova
funkcija
menjati objekat:
virtual
vojd
adjust(int)
= 0;
t.
//
0statak
datoteke
ie
isti
...
class
Wind
:
public
Instrument
{
public:
void
play(note)
const
{
cout
<<
"l,Ji
nd:
:
p'l
ay"
<<
endl
'
)
char*
what
0
const
{
return "l,Ji
nd''
; }
void
adjust(int)
()
);
class
Percussion
:
public
Instrument
{
publ
i
c:
void play(note) const
{
cout
<<
"Percussion:
:p1ay"
)
char*
what0
const
{
return
void adjust(int)
{}
);
class Stringed
:
public
Instrument
{
publ
i
c:
void
play(note)
const
{
<<
endl;
''Percussion";
)
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 250/300
virtual
uo,6
=
NaovainacirrsaopStavateprevodiocr'rda'rezerviseredzafunkcijuutabeli
\.1A81.1,,
ali
da
u
toi
,...f
n.
.r.itu
ua..ru.
eak
i
ako
je
samo
iedna
funkciia
klase
cleklarisana
kao
potpuno
virtuelna'
tabelaWABLE
niie
kompletna'
Sta
prevodilac
treba;"
;;i
ako
neko
poku5a
di
napravi
obiekat
klase
iija
tabela
VlAIlt-L
nijc
kompletna?
Po5to
ne
m.oZe
bezbedno
napraviti
obiekat
apstraktne
klase,
priiavll,i"
g'"st"'
Na
taj
natin
prevodilac
sprovodi
apstraktne
klase.Pravljenlemapstraktntkiu"spredavateprogrameraklilentadaiepogre-
5no
r-rpotrebi.
il
program
Instrument4'cpp
dodate
su
potpuno
virtuelne
funkciie'
Po5to
klasa itrra
.o*n
pn,1.,,,no
ui'ti'elne
funkciie'
nazivamo
ie
potpuno
apstraktna
l,1a.sn
(errgl. pttre
altstract
clctss\"
I
l:
C15:
Instrument5'cPP
//
Potpuno
apstraktne
osnovne
kl ase
#include
<iostream>
us
i
ng
names
Pace
s
td;
enum
note
{
middleC'
Csharp'
Cflat
};
ll
ltd'
cout
<<
"Stri
nged:
: p1
ay"
)
char*
what0
const
{
return
void adjust(int)
{}
I.
cl ass Brass
:
publ
i
c l"l'i
nd
{
publ
i
c:
void
play(note)
const
{
cout
<<
"Brass:
:
p1
ay"
<<
endl
'
)
char*
what0
const
{
return
"Brass";
}
);
class
Woodwi
nd
:
publ
i
c
l,,li nd
{
publ
i
c:
void
play(note)
const
{
cout
<<
"l,,/oodw'ind::P1aY"
..
endl;
<<
endl
;
"Stri
nged";
)
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 265/300
llii.
,,
.
.., ,
,
.fi
,,
;
.
..1...,::r;
::.
r,
..
,:
.
;
:,
.
l6:
Uvo-b
"u,SABtoue
Naslddivanj
e
i'
slaganj
e
omo
guiavaju
po
no\rno
ko
ri5ienj
e
obj ekt
-
nog
koda.
Sabloni
ujeziku
C**
o*oguiavaju
ponovno
lioriiienje
izuornogkoda.
I
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 282/300
5so
Misliti
na
jeziku
C++
i
ndex
=
rv.
i ndex
i
return
*thi
s
l
)
r teralor&
operator++
(
)
{
requl
rg(++1ndex
.=
PS.next,
'PSlash:
:
I
terdtor:
:operator++
"
"tndeks
rzvan
grantca")
;
return
*thr
s;
)
r
terator&
oPerator++
(
i nt)
{
return
oPerator++0 ;
)
i
terator&
oPerator--
0
(
requ'i
re
(-
-'i
ndex
>=
0,
"PStash:
:iterator:
:oPerator--
"
"
i
ndeks
1
zvan
grani
ca"
)
;
return
*thi
s;
)
iterator&
oPerator--(int) {
return
operator--
0
;
)
,17'
Premeitanje
lteratora
unapred
ili unazad:
i
terator&
operator+=
(
i
nt
amount)
i
requjre(index
+
amount
<
ps.next
&&
index
+
amount
>=
0,
'
PStash:
:
i
terator:
:
oPerator+=
"
'i
ndeks
i
zvan
grani
ca"
)
;
index
+=
amount;
return
*thi
s;
I
rterator&
operator-=(int
amount)
{
requi
re
(
i ndex
- amount
<
ps.
next &&
rndex
-
amount
>=
0,
"PStash: :
i
terator:
:oPerator-=
"
"indeks
izvan
granica")
;
i ndex
-=
amount;
Poglavlje
I6:
Uvod u
Sablone
551
T*
operator*0
const
(
return
current0;
)
T'
operator->0
const
i
require(ps.storageIindex] =
0,
"PStash:
:iterator:
:operator-> vraca
0")
I
return
current
0 ;
Uklanjanje
tekuceg
elementa:
remove
(
)
{
return
ps.
remove(i
ndex)
;
)
//
Uporedivanjem
se ispituje
da
li
je
kraj:
bool
operator==(const
iterator&
rv)
const
{
return
index
==
rv.index;
)
bool
operatort=(const
iterator&
rv)
const
{
return
index
=
rv.index;
)
);
iterator begin0
{
return
itenator(*this);
}
i
terator
end
0
(
return
i terator(*thi
s,
true)
;
)
I.
//
Uni
5tavanje objekata
kontejnera:
templ
ate<c1
ass T,
i
nt
i ncr>
PStashcT,
incr>::-PStash0
{
for(int i
= 0;
j
<
next;
i++)
{
delete
storageltl;
I I
Prazni
pokazivadi
su
u
redu
storageIi]
= 0;
ll
Samo radi
bezbednostj
)
de1
ete
[]
storage;
)
templ
ate<c'1
ass
T,
'i
nt
i
ncr>
int PStash<T,
incr>::add(T*
element)
{
if(next
>=
quantity)
inf1ate0;
)
T*
t-
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 283/300
return
*thi
s;
l
//
Pravj se
nov
iterator
kojl
se
pomera unapred
i terator
operator+
(
i
nt
amount
)
const
{
i
terator
ret
(*thi
s)
;
ret
+-
amount;
//
operator
+=
proverava
granice
return
ret
i
l
l*
current
(
)
const
{
return
ps.
storageIindex] ;
I
storage[next++]
=
element;
return(next
- t);
//
Broj
indeksa
)
templ
ate<c1
ass T,
i
nt
i
ncr>
i nl i ne
T*
PStash<T,
incr>::operator[]
(int
index)
const
{
require(index
>=
0,
"PStash::operator[]
indeks
je
negativan,')
;
i
f(index
>=
next)
return
0;
l/
Da
ukaie da
je
kraj
require(storageIindex]
= 0,
"PStash:
:operator[]
vratio
prazan pokazivac");
return
storage[index]
;
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 287/300
Misliti
na
jeziku
C++
560
I
7.
'rerrroritc
klas.
Int
iz-
programa
TPStash2Test.cpp
u
Sablon,
tako
da
sadrzi
bilo koii
tip
objekta
tsioUoAno
klasi
dodelite
ime
koie
joi
vi5e
odgovara)'
I
g. prctvoritc
klasu
IntArray
iz
programa
Iostreamoperatoroverloading'cpp
(poglavlie
I2),
tako
Jn
pu'nt"iti
budu
tip
sadrTanog
obiekta
ivelidina
internog
niz-a.
'I
9.
I)rctvorite
klasrr
obicontainer
tr
programu
NestedSmartPointer'cpp
(pog-
lavlje
l2)
tr
iablon,-festirajte
ie
pomoiu
dve
razlidite
klase'
2
0.
Izrrtcrtitc
ClS:OStack.h
i ClS:OStackTest'cpp
pretvaranjem
klase
Stack
u
Sablon,takodaatrtomatskivi5estrukonasledujeparametarsktt'klasui
klasu
Obiect.
Dobijena
klasa
Stack
treba
da
prihvata
i
proizvodi
samo
pokazivaic
sadrTanog
tiPa'
2l.Ponovorrraditcz,adatak20koristeiiklasuvectorumestok]aseStack.
22.
Izveclite
klasu
Stringvector
iz
klase
vectorcvoid*>
i redefinisite
funkciie
--
;1";i..
push-backi)
i operatorll
tako
da
prihvataiu
i.proizvode
samo
pokaz-ivade
tipa
string*
(izvr5ite
odgovaraiuiu
konverziiu)'
Zatim
napra-
vite
iablon
tnnt.ln.rikoii
isto
tn
'idi
automatski
zapokaziva(e
bilo
kog
tipa.Ovatehnikasecestokoristidabiseumanjilonarastaniekodausled
pievelikog
broja
instanciranja
Sablona'
23.
tJ
TPStash2.h
dodajte
operator
-
klasi
PStash::iterator
itestirajte
ga,
po
uzortl
na
operator
+'
24.
t)
Drawing.cpp
cloclajtt'itestirajtc
Sablon
funkciie
za
pozivanje funkcija
ilanica
erase(
).
25.
{Napredno)
Izmenite
klasu
Stack
u
Tstackz'h
tako
da
se
vlasniStvo
oclredtr
jc
,.n
na1nlanj"
jeclinice: svakoj
vezi
dodajte
indikator
koji
ukazuie
na
to
(la
ti
u"ru
p,,J"jtrie
objekat
na
koii
pokazuje
i
koristite
ovu
infor-
n.raciiu
tr
irrnkciii
p,,snt
)
i u
destruktoru'
Dodajte
funkcije
dlanice
za
ditanie
i izmentr
vlasniStva
svake
veze'
26.
(Napreclno)
Izmenite
PointerToMemberoperator.cpp
iz
poglavlja
12'
pret-
varanjerrlklaseFunctionobiectioperatora->*uSablonezaradsbilokojim
tipom
rezultata.
Za
operator
->*
iete
morati
da
koristite iablone
ilanoua
(engl.
nternlter
templ'ates),
opisane
u
drugom
tomul.
Dodajte,i,testiraite
podrsktr
za
nula,
leian
i
d'u uig'*et'ta
u
funkciiama
dlanicama
klase
Dog'
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 288/300
A:
STII
PISANJA
PROGRAMA
Ovo
nije dodatak
o
uvladenju
koda
i
kori5ienju zagrada
i
vitidastih
zagrada,
mada ie i
to biti
spomenuto. Navode
se
opSLe smernice,
kori5iene
za organizovanje teksta programa u ovoi
knjizi.
8/21/2019 Misliti na jeziku C++
http://slidepdf.com/reader/full/misliti-na-jeziku-c 297/300
",
'
.
*;i,
,,.,;i_,,.
.
.l
,':'r
\.r:
iar
rf.
':t:,
t