PRO - MIL Objekti
251 Sažimanje Veliki pro- Objekti Obrada Polja Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj C++ programiranje za apsolutne početnike
koda grami teksta odluke program
Objekti
Jednostavan primjer klase i objekata
U ovom trenutku mogla bi se manje cjeline. U tom slučaju
javiti dva pitanja koja su među- lakše se posao podijeli na više
sobno povezana. Jedno pitanje programera. Svaki radi svoju
je imamo li na raspolaganju sa- manju cjelinu. Manje cjeline lak-
mo one klase koje su napisali še se pišu i u njima se lakše
autor C++ jezika ili bismo mogli pronalaze greške.
napisati svoje vlastite klase.
Ako dio programa koji se često
Pitanje zašto bismo to uopće ponavlja izdvojimo u manju cjeli-
radili usko je povezano s drugim nu, koju pozivamo kad nam je
pitanjem, a to je na koji način se potrebna, dobit ćemo manji pro-
pišu veliki programi. Mi smo do gram u kojem se lakše vrše
sada pisali male programe. Pišu izmjene. Lakše je izmjenu unijeti
li se na isti način programi koji u jedan dio koji se poziva na
sadrže nekoliko stotina tisuća više mjesta, nego u slučaju kad
redova? Pišu li se oni na način se isti dio programa ponavlja na
da počnemo s #include desetak mjesta. U tom slučaju
<cstdlib> napišemo nekoliko trebali bi pronaći svih desetak
stotina tisuća redova, na kraju mjesta i na svima promijeniti
napišemo } i program je gotov. program na isti način, što je ve-
lik posao, a postoji i velika vjero-
Naravno da ne. To bi bilo nep- jatnost da će doći do greške.
raktično iz niza razloga. U sluča-
ju da program pišemo na taj na- Vidimo da bi bilo dobro podijeliti
čin (što je tehnički moguće), ja- program na manje dijelove pa
ko teško bismo pisanje progra- se postavlja pitanje kako ćemo
ma raspodijelili na više osoba i u to učiniti. To ćemo učiniti kreira-
tako velikom programu jako teš- njem vlastitih objekata ili preciz-
ko bismo pronalazili greške. nije rečeno, kreiranjem vlastitih
klasa na temelju kojih ćemo for-
Postoji još jedan problem. U mirati objekte.
većim programima često se isti
posao mora obaviti na više Postoji još jedan razlog zašto je
mjesta u programu. Npr. ako u dobro poznavati uporabu klasa i
telefonski imenik želimo unijeti objekata. Želimo li pisati progra-
ime, prezime, ulicu, grad, zani- ma koji će se umjesto u pojed-
manje i tome slično, istu provje- nostavljenom crnom prozoru
ru, npr. provjeru je li umjesto odvijati u normalnom windows
slova netko unio brojeve morali prozoru, apsolutno je nužno ra-
bismo ponoviti prilikom svakog zumjeti uporabu klasa i objeka-
od nabrojenih unosa. ta.
Svi navedeni problemi rješavaju
se tako da se program razdijeli u
252 PRO - MIL
C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
Imajmo u vidu da prednost uporabe objekata dolazi do izražaja u većim prog-
ramima. Manji programi koje ćemo vidjeti u ovom poglavlju mogu se elegan-
tnije napraviti bez uporabe objekata. Unatoč tome, mi ćemo vidjeti primjere
uporabe objekata u malim programima jer ćemo na primjerima malih progra-
ma lakše shvatiti princip uporabe objekata.
program
#include <cstdlib>
#include <iostream>
using namespace std;
class tekst odluke
{
Unesimo u program-
public: sku okolinu i pokreni-
void pisi() mo naš prvi program
{ koji koristi klase i ob-
cout << "Ovo je nas tekst." << endl; jekte.
}
Polja
};
Sažimanje Veliki pro- Objekti Obrada teksta
int main()
{
tekst t;
t.pisi();
cout << endl;
system("PAUSE");
return 0;
}
#include <cstdlib>
#include <iostream>
Uočimo da taj program radi using namespace std; grami
potpuno isti posao kao ovaj.
Očito je da se u malim progra- int main() koda
mima ne isplati koristiti klase i {
objekte. Njihove prednosti do-
laze do izražaja u većim prog- cout << "Ovo je nas tekst." << endl;
ramima. cout << endl;
system("PAUSE");
return 0;
}
PRO - MIL 253
Objekti
Najprije ćemo pogledati zanimljive dijelove našeg programa, a zatim funkcionira-
nje programa kao cjeline.
Ovaj dio programa izrazito je sličan ovom dijelu programa iz prošlog poglavlja.
tekst t; string tekst;
t.pisi(); tekst.reserve(256);
U prvom redu formira se objekt U prvom redu formirali smo objekt
klase tekst koji smo nazvali t. klase string koji smo nazvali tekst.
U drugom redu nad objektom t vrši U drugom redu nad objektom tekst
se operacija pisi(). Unutar zagrada izvršili smo operaciju reserve(250)
nema sadržaja, jer se ništa ne uno- kojom smo osigurali prostor za spre-
si u objekt t, ali su zagrade svejed- manje teksta. Između naziva objekta
no obvezne. i naziva operacije nalazi se točka.
Oblik t.pisi bez zagrada nije ispra-
van.
Naziv klase na temelju tekst t ; Naziv objekta koji formira-
koje ćemo formirati ob- mo na temelju klase. U
jekt. U našem slučaju našem slučaju formiramo
naziv klase je tekst. objekt t klase tekst.
Naziv objekta čiju meto- t . pisi() ; Naziv metode koju sadrži
du ćemo koristiti. U na- objekt t. U našem slučaju
šem slučaju koristit će- Obvezna točka. koristimo metodu pisi().
mo metodu t.
254 PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Ovdje vidimo da objekt Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream> možemo nazvati i dru-
gačije, npr. reci. odluke
using namespace std;
Ako smo formirali ob-
class tekst jekt reci, onda naredba
{ koja je do sada imala
oblik:
public:
void pisi() t.pisi();
{
cout << "Ovo je nas tekst." << endl; dobiva oblik:
}
reci.pisi();
};
Dakle, sad se operacija
int main() pisi vrši nad objektom
{ reci.
tekst reci;
reci.pisi();
cout << endl;
system("PAUSE");
return 0;
}
Polja
#include <cstdlib> Uočimo da postoji sličnost između Sažimanje Veliki pro- Objekti Obrada teksta
#include <iostream> formiranja objekta reci klase tekst i
varijable a tipa int. grami
using namespace std; I ovdje se najprije navodi tip varija-
ble, a zatim naziv a. koda
int main() Nad varijablom možemo vršiti raz-
{ ne operacije. U našem slučaju u
varijablu a spremamo broj 12.
int a;
a = 12;
cout << a << endl;
cout << endl;
system("PAUSE");
return 0;
}
PRO - MIL 255
Objekti
#include <cstdlib> Kao što možemo formirati
#include <iostream> više varijabli int tipa, tako
možemo formirati više
using namespace std; objekata klase tekst.
class tekst U ovom primjeru formirali
{ smo tri objekta, objekt
prvi, objekt drugi i objekt
public: treći.
void pisi()
{ Za biranje naziva objeka-
cout << "Ovo je nas tekst." << endl; ta vrijede slična pravila
} kao i za biranje naziva
varijabli.
};
int main()
{
tekst prvi;
tekst drugi;
tekst treci;
prvi.pisi();
drugi.pisi();
treci.pisi();
cout << endl;
system("PAUSE");
return 0;
}
class tekst Za razliku od klase string
{ koju je već netko prije na-
pisao, a mi je samo koris-
public: timo, klasu tekst morali
void pisi() smo sami napisati.
{
cout << "Ovo je nas tekst." << endl; U ovom dijelu programa
} formira se klasa tekst.
}; PRO - MIL
256
C++ programiranje za apsolutne početnike
Formiranje klase za- class tekst Nakon naredbe class Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
počinje naredbom slijedi naziv klase. U
class. To je naredba našem slučaju klasu
C++ jezika i ne može smo nazvali tekst, ali
se mijenjati. mogli smo i drugačije.
#include <cstdlib> U ovoj inačici programa program
#include <iostream> klasu smo nazvali BrdaI-
Doline. odluke
using namespace std;
To je dozvoljeno, samo Polja
class BrdaIDoline što sad naredbu koja je
{ prije imala oblik:
public: tekst t;
void pisi()
{ moramo napisati u obliku:
cout << "Ovo je nas tekst." << endl;
} BrdaIDoline t;
}; Dakle, formiramo objekt t
klase BrdaIDoline.
int main()
{ (Drugo je što je pametno
da nam naziv klase govo-
BrdaIDoline t; ri čemu klasa služi, pa je
t.pisi(); logičnije da se klasa za
cout << endl; ispis teksta zove tekst, a
system("PAUSE"); ne BrdaIDoline.)
return 0;
}
Sažimanje Veliki pro- Objekti Obrada teksta
Vidimo da je rezultat rada grami
takvog programa potpuno
jednak kao i rezultat rada koda
programa u kojem smo
formirali klasu tekst. 257
PRO - MIL
Objekti U ovom djelu nalazi se
popis varijabli i metoda
public: koje posjeduje neka kla-
void pisi() sa. Metode su mudar na-
{ ziv za operacije koje neka
cout << "Ovo je nas tekst." << endl; klasa može izvršiti.
}
U našem slučaju klasa ne
void pisi() sadrži varijable. Ima sa-
{ mo jednu metodu koju
smo nazivali pisi().
cout << "Ovo je nas tekst." << endl;
} Popis metoda počinje
naredbom public: Pobli-
{ že značenje te naredbe
cout << "Ovo je nas tekst." << endl; vidjet ćemo kasnije.
} Ova naša mala klasa ne
sadrži varijable i sadrži
258 samo jednu metodu od-
nosno može napraviti
samo jednu operaciju. Tu
metodu nazvali smo pisi
().
Ispred naziva metode
nalazi se naredba void.
Njeno značenje pobliže
ćemo objasniti kasnije.
Unutar vitičastih zagrada
nalaze se naredbe koje
pojedina metoda izvršava.
Naša jednostavna metoda
samo naredbom cout ispi-
suje tekst unutar navodni-
ka na zaslon računala.
PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Kao što smo klasu mogli Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream> nazvati drugačije, mogli
smo i metodu. odluke
using namespace std;
U ovom primjeru metodu
class tekst smo nazvali Pero().
{
To je dozvoljeno, samo
public: što ćemo naredbu koju
void Pero() smo do sada pisali u obli-
{ ku:
cout << "Ovo je nas tekst." << endl;
} t.pisi();
}; pisati u obliku:
int main() t.Pero();
{
Kao i kod biranja naziva
tekst t; varijabli i klasa, i ovdje je
t.Pero(); pametno da nam naziv
cout << endl; metode govori što meto-
system("PAUSE"); da radi. Zato je naziv pisi
return 0; za metodu koja ispisuje
} tekst bolji od naziva Pero.
Polja
Void naredba ispred void pisi () Dok naziv metode uz Sažimanje Veliki pro- Objekti Obrada teksta
naziva metode ozna- određena ograničenja
čuje da metoda ne možemo birati po volji,
vraća nikakvu vrijed- ove dvije zagrade se
nost. ovdje moraju obavezno
nalaziti.
U kojem smislu ne
vraća vrijednost vid- Naziv metode biramo po volji, pazeći na ogra- grami
jet ćemo kasnije kad ničenja o kojima smo govorili kad smo govorili
ovakvu metodu us- o biranju naziva varijabli. koda
poredimo s onima
koje vraćaju vrijed- Pametno je da naziv metode tako izaberemo
nost. da nam govori čemu metoda služi.
PRO - MIL 259
Objekti
Pogledajmo strukturu našeg programa.
#include <cstdlib>
#include <iostream>
using namespace std; Početni dio programa.
class tekst U ovom dijelu nalaze se klase
{ koje program koristi. U našem
slučaju imamo samo jednu
public: klasu, klasu pisi().
void pisi()
{
cout << "Ovo je nas tekst." << endl;
}
};
int main() Glavni dio programa. Sada možemo vidjeti zašto
{ smo program započinjali s int main() oznakom,
odnosno oznakom da je to glavni dio.
tekst t;
t.pisi(); Kad računalo pokrene program, najprije će se
cout << endl; pokrenuti ovaj dio, a ostali dijelovi će se koristiti
system("PAUSE"); po potrebi.
return 0;
}
Sadrža klase nalazi se Klasa se može sastojati od više tipova sadrža-
unutar vitičastih zagrada. ja. Jedan od njih je public. Kasnije ćemo pod-
robnije vidjeti što oznaka public označava.
class tekst U klasi se mogu nalazi-
{ ti varijable i metode. U
našem slučaju varijable
public: ne koristimo, a imamo
void pisi() jednu metodu koju smo
{ nazvali pisi().
cout << "Ovo je nas tekst." << endl;
} Metode su zapravo
programi koji određuju
}; koje operacije neka
klasa može izvesti .
260
PRO - MIL
C++ programiranje za apsolutne početnike
Unutar metode ne mora se Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
nalaziti program za ispis. Mo-
že se nalaziti bilo što, npr.
program za crtanje kruga.
#include <cstdlib> program
#include <iostream>
#include <winbgim.h> Iako program i ovako radi, odluke
malo ćemo ga preurediti.
using namespace std; Umjesto class tekst stavit Polja
ćemo class slika.
class tekst Sažimanje Veliki pro- Objekti Obrada teksta
{ Umjesto void pisi() stavit će-
mo void krug().
public:
void pisi() Umjesto tekst t; tj. umjesto
{ naredbe formiranja objekta t
int gdriver = 9; klase tekst stavimo slika cr-
int gmode = 2; taj. Time ćemo formirati ob-
initgraph(&gdriver, &gmode, ""); jekt crtaj klase slika.
setbkcolor(WHITE);
setcolor(BLACK); Umjesto t.pisi(); tj. umjesto
cleardevice(); pozivanja metode pisi() u klasi
circle(320,240,180); tekst stavit ćemo crtaj.krug();
getch();
closegraph();
}
};
int main()
{
tekst t;
t.pisi();
cout << endl;
system("PAUSE");
return 0;
}
Izbacimo naredbu cout << endl; i naredbu system("PAUSE");. grami
Iako program radi i s tim naredbama, bez njih će raditi nešto elegantnije. Ovaj
se program odvija u grafičkom prozoru pa su nepotrebni razmak i pauza u koda
tekstualnom prozoru.
PRO - MIL 261
Objekti
Složeniji primjeri klasa i objekata
Klasa može sadržavati više
metoda, npr. u ovom slučaju
sadrži tri metode.
#include <cstdlib> Prva metoda koju smo
#include <iostream> nazvali prva().
using namespace std; Druga metoda koju smo
nazvali druga().
class tekst
{ Treća metoda koju smo
nazvali treca().
public:
void prva() Objekt formiramo jed-
{ nom, a zatim pozivamo
cout << "Ovo je prva metoda." << endl; metode po logici da
} najprije navedemo na-
ziv objekta, zatim stavi-
void druga() mo točku i konačno
{ naziv metoda. Zagrade
na kraju te ; oznaka su
cout << "Ovo je druga metoda." << endl; obvezne.
}
void treca()
{
cout << "Ovo je treca metoda." << endl;
}
};
int main()
{
tekst t;
t.prva();
t.druga();
t.treca();
cout << endl;
system("PAUSE");
return 0;
}
262 PRO - MIL
C++ programiranje za apsolutne početnike
Program može sadržavati Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
više klasa, npr. u ovom
slučaju klasu tekst1 i klasu
tekst2.
program
#include <cstdlib> Prva klasa koju smo odluke
#include <iostream> nazvali tekst1.
Polja
using namespace std; Druga klasa koju
smo nazvali tekst2. Sažimanje Veliki pro- Objekti Obrada teksta
class tekst1
{ Ovdje na temelju grami
svake klase formi-
public: ramo objekt, a za- koda
void pisi() tim pozivamo me-
{ todu od svake kla-
cout << "Ovo je klasa tekst1." << endl; se odnosno opera-
} ciju koju objekt
može izvršiti
};
Uočimo da je doz-
class tekst2 voljeno da se me-
{ toda pod istim na-
zivom pisi() nalazi
public: u obje klase.
void pisi()
{
cout << "Ovo je klasa tekst2." << endl;
}
};
int main()
{
cout << "Zovemo metodu klase tekst1." << endl;
tekst1 t1;
t1.pisi();
cout << endl;
cout << "Zovemo metodu klase tekst2." << endl;
tekst2 t2;
t2.pisi();
cout << endl;
system("PAUSE");
return 0;
}
PRO - MIL 263
Objekti
#include <cstdlib> Jednom formirani
#include <iostream> objekt možemo proi-
zvoljni broj puta kori-
using namespace std; stiti u programu.
class tekst To je jedna od pred-
{ nosti korištenja klasa
i objekata.
public:
void pisi() Operaciju koja se u
{ programu često po-
cout << "Upravo koristimo objekt." << endl; navlja stavimo u kla-
} su, u programu for-
miramo objekt i pozi-
}; vamo određenu ope-
raciju kad god nam
int main() zatreba, bez potrebe
{ da je ponovo piše-
mo.
tekst t;
cout << "Objekt koristimo 1. put." << endl;
t.pisi();
cout << endl;
cout << "Objekt koristimo 2. put." << endl;
t.pisi();
cout << endl;
cout << "Objekt koristimo 3. put." << endl;
t.pisi();
cout << endl;
system("PAUSE");
return 0;
}
Sve klase koje smo do sada formirali bile su veoma Uporaba klasa i obje-
jednostavne budući da nisu komunicirale s ostat- kata veoma je slože-
kom programa na način da bi bilo moguće u klasu na ideja, i kao uvijek
unijeti neke podatke ili iz klase iščitati neke podat- do sada, imajmo na
ke, npr. brojeve ili tekst. umu da ćemo te pro-
gramske tehnike us-
U nastavku ovog poglavlja vidjet ćemo na koji na- vojiti tek kad napravi-
čin možemo u klase unositi ili iz klasa iščitavati po- mo velik broj primje-
datke. ra.
264 PRO - MIL
C++ programiranje za apsolutne početnike
Komunikacija s metodama Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
Pogledajmo sada program
koji sadrži klasu u koju je mo-
guće unijeti podatke iz drugih
dijelova programa.
program
#include <cstdlib> Klasa pravokutnik odluke
#include <iostream> sadrži jednu varija-
blu. To je varijabla Polja
using namespace std; c int tipa, a nalazi
se u private grupi. Sažimanje Veliki pro- Objekti Obrada teksta
class pravokutnik
{ Osim varijable u grami
private grupi, kla-
private: sa sadrži i dvije koda
int c; metode u public
grupi. To su meto-
public: da naslov() i me-
void naslov() toda povrsina (int
{ a, int b).
cout << "Povrsina pravokutnika." << endl;
cout << endl; U glavnom progra-
} mu formiramo ob-
jekt p klase pravo-
int povrsina (int a, int b) kutnik i koristimo
{ ga.
c = a * b; 265
return (c);
}
};
int main()
{
pravokutnik p;
p.naslov();
cout << "Povrsina je ";
cout << p.povrsina(2,3);
cout << endl << endl;
system("PAUSE");
return 0;
}
PRO - MIL
Objekti
#include <cstdlib>
#include <iostream>
using namespace std; Prethodni program malo smo modificirali da bi
lakše mogli shvatiti razliku između naredbe
class pravokutnik private i naredbe public.
{
private:
int c;
public: U public području dodali smo
int pov; varijablu koju smo nazvali pov.
void naslov()
{
cout << "Povrsina pravokutnika." << endl;
cout << endl;
} Sadržaj varijable c koja je formirana u
int povrsina (int a, int b) private području i u kojoj se nalazi re-
{ zultat izračuna površine spremili smo u
varijablu pov koja je formirana u public
c = a * b; području.
pov = c;
return (c);
}
}; Ovdje vidimo da sadržaju varija-
int main() ble pov možemo pristupiti u
{ glavnom programu, iako je for-
mirana u objektu. Pristupamo joj
pravokutnik p; tako da prvo napišemo naziv
p.naslov(); objekta zatim točku i na kraju
cout << "Povrsina je "; varijablu, dakle u p.pov obliku.
cout << p.povrsina(2,3);
cout << endl; Pokušamo li na isti način pristu-
cout << "p.pov je " << p.pov << endl; piti varijabli c, doći će do greške.
// cout << "p.c je " << p.c << endl; (Želimo li probati, maknimo //
oznaku na početku reda.)
cout << endl << endl; Već iz ovog primjera bismo mo-
system("PAUSE"); gli zaključiti u kojem smislu je c
return 0; varijabla private, a kojem smislu
} je pov varijabla public.
266 PRO - MIL
C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
Naredba private označava područje u kojem se nalaze varijable i metode
koje se mogu koristiti unutar klase odnosno unutar objekta, ali se njima ne
može pristupiti iz glavnog programa, odnosno izvan objekta. U ovom progra-
mu u private području imamo samo varijablu c. Mogli bismo imati i procedure.
program
class pravokutnik Za razliku od private odluke
{ područja, svemu što
formiramo u public Polja
private: području možemo
int c; pristupiti i izvan kla-
se, odnosno izvan
public: objekta.
int pov;
void naslov() To ne možemo učini-
{ ti tako da samo na-
cout << "Povrsina pravokutnika." << endl; vedemo naziv varija-
cout << endl; ble ili procedure ne-
} go tako da prvo na-
vedemo naziv objek-
int povrsina (int a, int b) ta, zatim točku i na
{ kraju naziv varijable
ili procedure. Ako
c = a * b; pristupamo procedu-
pov = c; ri, moramo navesti i
return (c); zagrade.
}
};
Sažimanje Veliki pro- Objekti Obrada teksta
Ovdje su formirane još dvije varijable, varijabla a i varijabla b. Iako bi bilo grami
logično da tim varijablama možemo pristupiti izvan klase odnosno izvan ob-
jekta, jer su formirane u public području, to ipak nije slučaj. Pokušamo li im koda
pristupiti izvan objekta doći će do greške.
Dakle izvana možemo pristupiti samo onim varijablama koje su u public po-
dručju formirane samostalno kao pov varijabla, a ne možemo onima koje su
formirane unutar neke metode.
PRO - MIL 267
Objekti
private: Unutar private područja u ovom slučaju formirali smo sa-
int c; mo varijablu c. Mogli bismo staviti i procedure, ali u tom
slučaju bismo tim procedurama mogli pristupiti samo
unutar klase odnosno samo unutar objekta. Način pisa-
nja bio bi isti kao i unutar public područja.
Ovdje formiramo pov varijablu int tipa. Varijable unutar klase formiramo na pot-
puno jednak način kao i unutar glavnog programa.
public: Ovdje formiramo meto-
int pov; du za ispis teksta na
zaslon računala. Takav
void naslov() tip procedure već smo
{ vidjeli u prethodnim
primjerima.
cout << "Povrsina pravokutnika." << endl;
cout << endl; Ovdje formiramo meto-
} du za izračun površine
pravokutnika. Vidimo
int povrsina (int a, int b) da joj je oblik drugačiji
{ od oblika naslov() me-
tode pa ćemo je pobliže
c = a * b; pogledati.
pov = c;
return (c);
}
Do sada smo formiranje Naziv metode. Ulazne varijable su
metode započinjali s void. unutar zagrada.
Ova metoda započinje s int.
int povrsina ( int a, int b )
Što to znači?
Ovdje je popis varijabli koje možemo uni-
To znači da će ova metoda jeti u metodu.
biti int tipa, odnosno da će
rezultat njenog rada biti broj U ovu metodu možemo unijeti dva broja.
int tipa. Prvi će biti spremljen u varijablu a, drugi u
varijablu b, a oba su int tipa.
Naredbom:
cout << p.povrsina(2,3);
ispisat ćemo rezultat rada
metode povrsina na zaslon,
a rezultat je broj int tipa.
268 PRO - MIL
C++ programiranje za apsolutne početnike
Pogledajmo još jednom naredbu za formiranje metode koja započinje void Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
naredbom.
Void naredba znači da metoda Prazne zagrade znače da u ovu program
naslov neće vraćati nikakav re- metodu ništa nije moguće unijeti
zultat rada. na način da se napiše: odluke
Sad će netko upitati, kako ne p.naslov(2,3);
vraća kad ispisuje tekst na zas-
lon. Moguće je unutar metode staviti
cin naredbu pa nešto unijeti npr.
Ispisuje, ali se ispisivanje zbiva preko tipkovnice, ali nije moguće
unutar metode. ništa unijeti na gore opisan na-
čin.
U glavnom programu moguće je
napisati: void naslov ()
cout << p.povrsina(2,3); Polja
ali nije moguće napisati:
cout << p.naslov();
Moguće je jedino s:
p.naslov();
pozvati metodu naslov koja on-
da unutar sebe ispisuje tekst na
zaslon računala.
Sažimanje Veliki pro- Objekti Obrada teksta
c = a * b; Unutar metode mogu se koristiti varijable koje smo grami
pov = c; koristili za unos, varijabla a i varijabla b, te se mogu
koristiti sve one varijable koje su formirane u public koda
return (c); ili private području, dakle varijabla c i varijabla pov.
PRO - MIL Ovom naredbom određujemo koju vrijednost će pro-
cedura vraćati u glavni program, odnosno što će
naredba cout << p.povrsina(2,3); ispisati.
269
Objekti
#include <cstdlib>
#include <iostream>
using namespace std;
class racunaj U ovom programu možemo
{ lijepo vidjeti kako o naredbi
return ovisi što će se naredbom
private: r.metoda1(2,4) ispisati na zas-
int c; lon računala.
public:
int metoda1(int a, int b)
{
c = a + b;
return (c);
}
int metoda2(int a, int b)
{
c = a + b;
return (a);
}
int metoda3(int a, int b) Ako smo u me-
{ todi upotrijebili
naredbu return
c = a + b; (c), naredbom
return (b); r.metoda1(2,4)
} ispisat će se
}; sadržaj varijable
c.
int main()
{
racunaj r;
cout << "return(c) daje " << r.metoda1(2,4) << endl; Naredbom re-
cout << "return(a) daje " << r.metoda2(2,4) << endl; turn(a) ispisat
cout << "return(b) daje " << r.metoda3(2,4) << endl; će se sadržaj
varijable a, a
system("PAUSE"); naredbom re-
return 0; turn(b) ispisat
} će se sadržaj
varijable b.
270 PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream>
U ovom programu imamo odluke
using namespace std; dvije void metode. Meto-
dom unesi unose se bro- Polja
class racunaj jevi u varijablu a i varijab-
{ lu b. To se vrši unutar Sažimanje Veliki pro- Objekti Obrada teksta
metode. Nije moguće
private: napisati naredbu:
int a;
int b; p.povrsina(2,3);
int c;
Moguće je jedino nared-
public: bom:
void unesi(void)
{ p.unesi();
cout << "Unesite stranicu a." << endl;
cin >> a; pozvati metodu za unos
cout << "Unesite stranicu b." << endl; brojeva.
cin >> b;
} Metodom povrsina izra-
void povrsina(void) čunava se površina i ispi-
{ suje rezultat.
c = a * b;
cout << "Povrsina je " << c << endl; Rezultat se ispisuje unu-
} tar metode. Nije moguća
naredba:
};
cout << p.povrsina();
int main()
{
racunaj p;
p.unesi();
p.povrsina();
cout << endl;
system("PAUSE");
return 0;
}
grami
koda
PRO - MIL 271
Objekti
#include <cstdlib>
#include <iostream>
using namespace std;
class racunaj U ovom programu najprije računamo površinu, a
{ zatim dobiveni rezultat množimo sa cijenom kvad-
ratnog metra površine da bismo dobili cijenu povr-
private: šine.
int a;
int b;
int c; Vidjeli smo da rezultat
public: izračuna unutar meto-
void unesi(void) de možemo ispisati na
{ dva načina. Ako je me-
toda tipa void onda se
cout << "Unesite stranicu a." << endl;
rezultat ispisuje unutar
cin >> a;
metode. Tada naredba
cout << "Unesite stranicu b." << endl;
tipa:
cin >> b;
} cout << povrsina();
int povrsina(void)
{ nije moguća.
c = a * b;
return (c);
} Ako metoda nije void
Obratimo pažnju na tipa, nego int ili float ili
};
činjenicu da unutar char, onda je moguće
int main() glavnog programa smi- napisati gore navedenu
{ jemo koristiti c varijab- naredbu.
int c; lu, iako c varijabla pos-
int u; toji u klasi racunaj. Postavlja se pitanje u
racunaj p; čemu je razlika u fun-
p.unesi(); kcionalnosti tih dvaju
cout << "Cijena kvadratnog metra." << endl; načina ispisa.
cin >> c; Razlika je u tome da
u = c * p.povrsina(); ako metoda nije void
cout << "Cijena poda je " << u << endl; tipa, onda metodu mo-
cout << endl; žemo koristiti unutar
system("PAUSE"); izraza poput:
return 0;
} u = c * p.povrsina();
272 PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream>
Ako za ispis koris- odluke
using namespace std; timo void metodu
pa uporaba nared- Polja
class racunaj be return nije mo-
{ guća, ispisom re- Sažimanje Veliki pro- Objekti Obrada teksta
zultata unutar me-
private: tode možemo ispi- grami
int a; sati više vrijednos-
int b; ti. koda
int c;
int p; U ovom slučaju u
int u; metodi cijena mi
ispisujemo površi-
public: nu i cijenu.
void unesi(void)
{ Da je to int meto-
cout << "Unesite stranicu a." << endl; da i da rezultat
cin >> a; vraćamo return
cout << "Unesite stranicu b." << endl; naredbom, mogli
cin >> b; bi napisati ili return
cout << "Cijena kvadratnog metra." << endl; (p) ili return(u), ali
cin >> c; ne bismo mogli
} vratiti obje vrijed-
void cijena(void) nosti.
{
p = a * b; Ukratko, koju od
cout << "Povrsina je " << p << endl; metoda ispisa će-
u = p * c; mo upotrijebiti ovi-
cout << "Cijena je " << u << endl; si o potrebama
} koje moramo za-
dovoljiti.
};
int main()
{
racunaj p;
p.unesi();
p.cijena();
cout << endl;
system("PAUSE");
return 0;
}
PRO - MIL 273
Objekti
Naredba cout << p.povrsina(2,3); zbunjujuća je između ostalog i zato što istov-
remeno služi za unos broja 2 i broja 3 u metodu i za ispis rezultata množenja,
odnosno rezultata rada metode.
cout << p.povrsina( 2, 3 ); Kad računalo naiđe na ovak-
vu naredbu, najprije će broj
dva i broj tri proslijediti u vari-
jablu a i varijablu b koje se
nalaze u metodi povrsina.
int povrsina ( int a, int b ) Unutar metode povr-
{ sina računalo će sa-
držaj varijable a i va-
c = a * b; rijable b pomnožiti, a
return ( c ); rezultat spremiti u
} varijablu c.
cout << p.povrsina(2,3) ; Kad računalo naiđe na
naredbu return(c),
274 sadržaj varijable c ispi-
sat će na zaslon raču-
nala.
Ova naredba tada će
funkcionirati kao da
smo u programu koji
ne sadrži klase i objek-
te napisali:
cout << c;
PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream>
Kao što smo već odluke
using namespace std; rekli, metode ne
moraju biti int tipa. Polja
class pravokutnik Mogu biti i nekog
{ drugog tipa. U Sažimanje Veliki pro- Objekti Obrada teksta
ovom programu
private: imamo metodu grami
float c; float tipa.
koda
public: Vidimo da nared-
void naslov() bu:
{ p.povrsina(a1,b1)
cout << "Povrsina pravokutnika." << endl; možemo pisati i
cout << endl; tako da unutar
} zagrada umjesto
float povrsina (float a, float b) konkretnih brojeva
{ stavimo varijable.
c = a * b;
return (c); 275
}
};
int main()
{
float a1;
float b1;
pravokutnik p;
p.naslov();
cout << "Unesite stranicu a." << endl;
cin >> a1;
cout << "Unesite stranicu b." << endl;
cin >> b1;
cout << "Povrsina je ";
cout << p.povrsina(a1,b1);
cout << endl << endl;
system("PAUSE");
return 0;
}
PRO - MIL
Objekti
Razdvajanje deklaracije i definicije
Do sada su se metode nalazile
unutar klase. U složenijim pro-
gramima najčešće je deklaraci-
ja klase odvojena od definicija
metoda.
U deklaraciji klase metode se
samo nabroje, a definicije me-
toda se nalaze drugdje.
#include <cstdlib> U deklaraciji klase samo su
#include <iostream> nabrojeni elementi klase i po-
dijeljeni u private i public pod-
using namespace std; ručje.
class pravokutnik Ovdje se nalazi samo zaglav-
{ lje metode pravokutnik u ko-
jem su određena ulazna i izla-
private: zna svojstva metode, ali ovdje
int c; nema sadržaja metode.
public:
int povrsina (int a, int b);
};
int pravokutnik :: povrsina (int a, int b)
{ Sadržaj metode pravokut-
c = a * b;
nik, odnosno dio programa
return (c);
kojim određujemo što će
}; metoda pravokutnik raditi
int main() nalazi se ovdje.
{
cout << "Povrsina pravokutnika" << endl; Ovako napisanu
cout << endl; klasu koristimo
pravokutnik p; na isti način kao
cout << "Povrsina je = " << p.povrsina(2,3) << endl; i klase koje smo
cout << endl; do sada koristili.
system("PAUSE");
return 0;
}
276 PRO - MIL
C++ programiranje za apsolutne početnike
Pogledajmo kako su povezane deklaracija metode i definicije metode. Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
Tip vrijednosti koju će metoda Obvezna ; ozna- program
vraćati kao rezultat. U ovom ka
slučaju je int, a mogao bi biti i
neki drugi npr. float. Deklaracija metode u dek-
laraciji klase. Ovdje je na-
veden naziv metode i ulaz-
no-izlazna svojstva meto-
de, ali ne i program meto-
de.
int povrsina (int a, int b) ; Definicija me- odluke
int pravokutnik :: povrsina (int a, int b) tode. Ovdje
se nalazi pro-
gram koji od-
ređuje što ta
metoda radi,
odnosno svoj-
stva metode.
Naziv klase. Naziv metode. Popis varijabli preko
kojih se brojevi mogu
unijeti u metodu.
Obvezna :: oznaka između naziva klase i Polja
naziva metode.
U većini slučajeva do sada noviji način izrade programa bio je elegantniji Sažimanje Veliki pro- Objekti Obrada teksta
od starog. U ovom slučaju to baš ne izgleda tako. Ovakav način pisanja
klase očigledno je manje elegantan od prethodnog. Postoji veća vjerojat- grami
nost da će doći do greške budući da treba uskladiti deklaraciju metode i
definiciju metode. koda
Ovaj način pisanja klasa doista je manje elegantan od načina koji smo kori-
stili u prethodnim programima i ima ga smisla upotrebljavati samo kad želi-
mo veći program razdijeliti u više datoteka. Ako klase pišemo na ovaj na-
čin, tada možemo u jednu datoteku staviti sve deklaracije klasa, a u druge
datoteke definicije metoda. Ako se program nalazi u jednoj datoteci, bolje je
definiciju metode napisati unutar deklaracije metode kao što smo to činili u
prethodnim programima.
PRO - MIL 277
Objekti
Uporaba konstruktora
#include <cstdlib>
#include <iostream>
using namespace std;
class pravokutnik U ovom programu nalazi se nekoli-
{ ko neobičnosti.
private:
int a; Prva neobičnost jest ova metoda.
int b; Neobično je to što ima isti naziv
public: kao i klasa. Klasu smo nazvali pra-
pravokutnik(void) vokutnik i ova metoda zove se pra-
{ vokutnik.
cout << "Stranica a:" << endl;
cin >> a; Druga neobičnost jest što ova me-
cout << "Stranica b:" << endl; toda nema nikakvu oznaku povrat-
cin >> b; ne vrijednosti, nije ni void pravoku-
} tnik(), ni int pravokutnik().
int povrsina(void)
{
return (a * b);
} Neobično je i to
}; što je nigdje ne
int main() pozivamo.
{ U ovom redu
pravokutnik p; formiramo objekt
cout << "Povrsina je " << p.povrsina() << "." << endl; p klase pravoku-
cout << endl; tnik, a već u slje-
system("PAUSE"); dećem redu po-
return 0; zivamo metodu
povrsina.
}
Iako nigdje u programu nije vidljivo pozivanje metode pravokutnik, njen sadržaj
se očigledno izvršava. Očigledno je da prije izvođenja metode površina računa-
lo unosi stranicu a i stranicu b. Takva metoda naziva se konstruktor, a izvršava
se u trenutku formiranja objekta. Dakle, ova metoda izvršila se u trenutku kad
smo naredbom pravokutnik.p formirali objekt p klase pravokutnik.
278 PRO - MIL
C++ programiranje za apsolutne početnike
#include <cstdlib> Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
#include <iostream>
using namespace std;
class pravokutnik
{ U ovom programu imamo
private:
dva konstruktora.
int a;
int b; Jednome je ulazni dio void
public: tipa, što znači da se u njega
pravokutnik(void) ne može unositi vrijednost
{ tako da napišemo:
cout << "Stranica a:" << endl;
cin >> a; pravokutnik p2(3,4); odluke
cout << "Stranica b:" << endl;
cin >> b;
} Drugome je ulazni dio (int a1,
pravokutnik(int a1, int b1) int b1), što znači da se u nje-
{ ga može vrijednost unositi
tako da napišemo:
a = a1;
b = b1;
} pravokutnik p2(3,4); Polja
int povrsina(void)
{
return (a * b);
} Ovdje formiramo objekt klase pravokutnik bez Sažimanje Veliki pro- Objekti Obrada teksta
}; vrijednosti u zagradi. U tom slučaju primijenit
int main() će se pravokutnik(void) konstruktor.
{
pravokutnik p1;
cout << "Povrsina je " << p1.povrsina() << "." << endl;
cout << endl;
pravokutnik p2(3,4);
cout << "Za p2(3,4) povrsina je " << p2.povrsina() << "." << endl;
cout << endl; grami
system("PAUSE"); Objekt p2(3,4); u zagradi ima dva broja, pa će se u
return 0;
} tom slučaju primijeniti pravokutnik(int a1, int b1) kon-
struktor. U tom slučaju površina će se izračunati
koda
množenjem brojeva 3 i 4, bez unosa tipkovnicom.
PRO - MIL 279
Objekti
Nasljeđivanje
#include <cstdlib>
#include <iostream>
using namespace std;
class kvadrat Klasa kvadrat napisana je na
{ uobičajeni način.
protected:
int br;
public:
void unos (void) Klasa kub napisana je na način koji
{ do sada nismo koristili.
cout << "Unesite broj:" << endl;
cin >> br; Naredbom:
}
int izracun (void) class kub : public kvadrat
{
return (br * br); formiramo klasu kub koja nasljeđuje
} varijable i metode klase kvadrat. Dak-
}; le klasa kub može koristiti metodu
class kub : public kvadrat unos, iako je ona definirana u klasi
{ unos.
public:
int izracun(void)
{
return (br * br * br); Objekt objekt2 klase kub može koristiti meto-
} du unos koja se nalazi u klasi kvadrat kao da
}; je njezina klasa. To je moguće jer je klasa
int main() kub naslijedila klasu kvadrat.
{
kvadrat objekt1;
objekt1.unos();
cout << "Kvadrat je " << objekt1.izracun() << endl; Metodu izracun
cout << endl; posjeduju obje
kub objekt2; klase. U tom slu-
objekt2.unos(); čaju klasa kub ko-
cout << "Kub je " << objekt2.izracun() << endl; ristit će svoju inači-
cout << endl; cu objekta izracun.
system("PAUSE"); Inačica u klasi kub
return 0; prekrila je inačicu
} u klasi kvadrat.
280 PRO - MIL
C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
Pogledajmo međusobnu povezanost bitnih dijelova programa u kojem je primi-
jenjena tehnika nasljeđivanja klasa.
class kvadrat U klasi kvadrat definirane su program
void unos (void) dvije metode, metoda unos i
int izracun (void) metoda izračun.
Klasu kvadrat možemo koristiti
na način koji smo koristili u do-
sadašnjim primjerima.
Naziv nove klase. Naredba za nas- Klasa koju klasa kub nasljeđuje.
ljeđivanje klase.
odluke
class kub : public kvadrat Ovako deklarirana klasa kub Polja
int izracun (void) nasljeđuje sve varijable i me-
tode klase kvadrat. Sažimanje Veliki pro- Objekti Obrada teksta
kub objekt2;
Klasa sadrži metodu izracun,
iako metodu izračun posjeduje
i klasa kvadrat koju nasljeđuje.
U tom slučaju klasa kub koris-
tit će vlastitu inačicu metode
izracun.
objekt2.unos(); Ovdje koristimo metodu unos, iako je kla-
sa kub ne posjeduje. To je moguće jer
klasa kub nasljeđuje klasu kvadrat, a kla-
sa kvadrat sadrži klasu unos.
grami
objekt2.izracun() Iako metodu izracun posjeduje i klasa kva- koda
drat, objekt2 koristit će vlastitu inačicu me-
tode izračun.
PRO - MIL 281
Veliki programi
282 PRO - MIL
PRO - MIL Veliki programi
283 Sažimanje Veliki pro- Objekti Obrada Polja Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj C++ programiranje za apsolutne početnike
koda grami teksta odluke program
Veliki programi
Jednostavna igra u jednoj datoteci
#include <cstdlib> Ovaj program nešto je veći od pro-
#include <iostream> grama koje smo do sada pisali, pa
#include <winbgim.h> će se zato protezati kroz nekoliko
#include <ctime> stranica.
using namespace std; Ovdje se nalazi deklaracija klase
objekt. Sastoji se od dvije varijab-
class objekt le, x i kretanje; te od dvije metode,
{ pomak i crtaj.
private: Unutar deklaracije klase nalazi se
int x; konstruktor koji varijabli x daje
char kretanje; početnu vrijednost 290.
public: Ta varijabla određuje poziciju ob-
objekt() jekta koji pomičemo pomoću tip-
{ kovnice.
x = 290;
} Ovdje je sadržaj metode pomak.
void pomak(char);
void crtaj(); U metodu se unosi podatak o
tome koja tipka je pritisnuta.
};
void objekt :: pomak(char tipka) Metoda ispituje je li pritisnuta
{ strelica u lijevu ili strelica u des-
nu stranu. Ako je neka od tih
kretanje = tipka; tipki pritisnuta, vrijednost varijab-
if (kretanje == 75) le x koja određuje položaj objek-
{ ta koji pomičemo adekvatno će
se povećati ili smanjiti.
setcolor (WHITE);
rectangle(x, 432, x+60, 438); Ovdje je sadržaj metode crtaj. Ona
setcolor (BLACK); crta objekt koji pomičemo pomoću
x = x - 5; strelica na tipkovnici.
}
if (kretanje == 77)
{
setcolor (WHITE);
rectangle(x, 432, x+60, 438);
setcolor (BLACK);
x = x + 5;
}
}
void objekt :: crtaj()
{
rectangle(x, 432, x+60, 438);
}
284 PRO - MIL
C++ programiranje za apsolutne početnike
Male programe možemo smjestiti u jednu datoteku. Za veće programe to nije Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
praktično rješenje. Ako je veliki program u jednoj velikoj datoteci teže je pro-
naći grešku, teže je napraviti izmjenu programa i teže je podijeliti posao iz-
među više programera.
U ovom poglavlju vidjet ćemo kako podijeliti jedan nešto veći program u više
datoteka. Najprije ćemo program napisati u jednoj velikoj datoteci, a zatim ga
podijeliti u više manjih datoteka.
Ovdje se nalazi deklaracija klase bomba. Sastoji
se od varijabli x i y koje određuju položaj bombe na
zaslonu te metode crtanje koja crta bombu i od
metode brisanje koja briše bombu da bi se dobila
class bomba iluzija kretanje bombe.
{ Deklaracija sadrži konstruktor koji određuje počet-
private: nu poziciju bombe.
int x, y;
public: odluke
bomba()
{
x = (static_cast <float> (rand()) / RAND_MAX) * 620;
y = -((static_cast <float> (rand()) / RAND_MAX) * 480);
}
void crtanje();
void brisanje();
};
void bomba :: crtanje() Sadržaj metode crtanje. Polja
{
rectangle (x,y,(x+20),(y+5));
} Sažimanje Veliki pro- Objekti Obrada
void bomba :: brisanje() Sadržaj metode brisanje. teksta
{
setcolor(WHITE);
rectangle (x,y,(x+20),(y+5));
setcolor(BLACK);
y = y + 5;
if (y > 490)
{
y = -((static_cast <float> (rand()) / RAND_MAX) * 480); grami
x = (static_cast <float> (rand()) / RAND_MAX) * 620;
}
}
koda
PRO - MIL 285
Veliki programi
Ovdje se nalazi glavni dio programa koji će koristi-
ti prije formirane klase.
int main() Određivanja svojstva grafike, veliči-
{ ne grafičkog prozora, boje pozadi-
ne i boje objekata.
int gdriver = 9;
int gmode = 2; Formiranje varijable odgovor u ko-
initgraph(&gdriver, &gmode, ""); joj će se nalaziti podatak o trenutno
setbkcolor(WHITE); pritisnutoj tipki.
setcolor(BLACK);
cleardevice(); Formiranje generatora slučajnih
brojeva kojim ćemo određivati
char odgovor = 'd'; mjesto pojavljivanja bombi, odnos-
no objekata koji se kreću odozgo
srand(time(NULL)); prema dolje.
bomba bomba1, bomba2, bomba3; Formiranje triju objekta klase bom-
ba, bomba1, bomba2 i bomba3.
objekt brod; To su objekti koji se kreću odozgo
prema dolje.
brod.crtaj();
Formiranje objekata brod klase
do objekt. To je objekt koji mi pomiče-
{ mo pomoću tipkovnice, koristeći
strelicu u lijevo i strelicu u desno.
bomba1.brisanje();
bomba2.brisanje(); Crtanje objekta koji pomičemo na
bomba3.brisanje(); početnoj poziciji korištenjem meto-
de crtaj.
Ovdje se u svakom objektu klase
bomba poziva metoda brisanje
bombe na staroj poziciji.
286 PRO - MIL
C++ programiranje za apsolutne početnike
bomba1.crtanje(); Ovdje se u svakom objektu klase Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
bomba2.crtanje(); bomba poziva metoda za crtanje bom-
bomba3.crtanje(); be na novoj poziciji. odluke
delay(1); Neprestanim brisanjem bombe na sta- Polja
roj poziciji i crtanjem na novoj stvara
if (kbhit()) se iluzija kretanja, odnosno padanja Sažimanje Veliki pro- Objekti Obrada teksta
{ bombi.
grami
odgovor = getch(); Naredba koja zaustavlja program odre-
đeno vrijeme. Služi za regulaciju brzine koda
brod.pomak(odgovor); igre.
}
Ovdje ispitujemo je li pritisnuta neka
brod.crtaj(); tipka na tipkovnici.
} Ako je pritisnuta neka tipka na tipkovni-
ci, ovdje se kod pritisnute tipke sprema
while (odgovor != 'k'); u varijablu odgovor.
return 0; Ovdje se poziva metoda pomak koja će
} obrisati objekt na staroj poziciji.
PRO - MIL Ovdje se poziva metoda crtaj koja će
nacrtati objekt na novoj poziciji.
Izvođenje igre prekida se pritiskom na
tipku k.
Ovdje se ispituje je li pritisnuta tipka k i,
ako je pritisnuta, izvođenje igre se zau-
stavlja.
Nemojmo zaboraviti da sva četiri dijela
programa moraju biti unijeta u našu pro-
gramsku okolinu da bismo mogli pokre-
nuti program.
287
Veliki programi
Jednostavna igra u više datoteka
Pogledajmo sada kako ćemo prethodni program
raspodijeliti u više datoteka.
Otvorimo novi projekt na uobičajen način.
Prije toga otvorimo praznu mapu u koju ćemo
spremiti novi projekt.
Izaberemo Console Application.
288 PRO - MIL
PRO - MIL
U Parameters unesemo -lbgi -lgdi32 C++ programiranje za apsolutne početnike
Izaberemo Postavke projekta.
289 Sažimanje Veliki pro- Objekti Obrada Polja Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
koda grami teksta odluke program
Veliki programi
1 - Desni klik na naziv pro-
jekta. U našem slučaju je
to Projekt1.
2 - Klik na Novo.
Otvorit će se nova datoteka
pod nazivom Neimenovano1.
290 PRO - MIL
C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
1 - Desni klik na Neimenovano1.
odluke
2 - Klik na Preimenuj datoteku.
Polja
Datoteku preimenujemo u bom-
ba.cpp i kliknemo na OK.
Sažimanje Veliki pro- Objekti Obrada teksta
grami
koda
PRO - MIL 291
Veliki programi
Na taj način formirali smo
datoteku bomba.cpp.
Na sličan način formirat ćemo datoteke:
- bomba.h
- objekt.cpp
- objekt.h
292 PRO - MIL
C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
U datoteku bomba.cpp spremimo me-
tode klase bomba; metodu crtanje i
metodu brisanje.
program
Ovom naredbom uključuje se Ovaj dio isti je kao u programu koji odluke
biblioteka grafičkih naredbi. se nalazi u jednoj datoteci.
Razlika je u tome što su dodane
dvije include naredbe.
#include <winbgim.h> Ovom naredbom uključuje se Polja
#include "bomba.h" datoteka bomba.h u kojoj se
nalazi deklaracija klase bom-
ba.
void bomba :: crtanje() Ovdje uključujmo datoteku u Sažimanje Veliki pro- Objekti Obrada teksta
{ kojoj se nalazi deklaracija kla-
se čije metode ovdje definira-
rectangle (x,y,(x+20),(y+5)); mo.
}
void bomba :: brisanje()
{
setcolor(WHITE);
rectangle (x,y,(x+20),(y+5)); Ovaj dio programa isti je kao i u
setcolor(BLACK); prethodnoj inačici.
y = y + 5;
if (y > 490) grami
{
y = -((static_cast <float> (rand()) / RAND_MAX) * 480);
x = (static_cast <float> (rand()) / RAND_MAX) * 620;
}
} koda
PRO - MIL 293
Veliki programi
U datoteku bomba.h spremimo
deklaraciju klase bomba.
Ovo je dio programa koji se u ovoj inačici razli-
kuje od inačice sa samo jednom datotekom.
Ako je naziv datoteke bomba.h, ovaj dio imat
će oblik:
#ifndef BOMBA_H
#ifndef BOMBA_H #define BOMBA_H
#define BOMBA_H Kad bi se datoteka zvala npr. datoteka.h, ovaj
class bomba dio imao bi oblik:
{ #ifndef DATOTEKA_H
private: #define DATOTEKA_H
int x, y;
public:
bomba()
{
x = (static_cast <float> (rand()) / RAND_MAX) * 620;
y = -((static_cast <float> (rand()) / RAND_MAX) * 480);
}
void crtanje();
void brisanje(); Naredbu #endif pisat ćemo na kraju
}; svake datoteke koja počinje nared-
#endif bom #ifndef.
294 PRO - MIL
C++ programiranje za apsolutne početnike Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj
U datoteku objekt.cpp spremimo
metode klase bomba; metodu
pomak i metodu crtaj.
program
#include <winbgim.h> Naredbama #include odluke
#include "objekt.h" uključimo grafičku biblio-
teku winbgim.h i dato- Polja
void objekt :: pomak(char tipka) teku objekt.h u kojoj se
{ nalazi deklaracija klase Sažimanje Veliki pro- Objekti Obrada teksta
objekt.
kretanje = tipka; grami
if (kretanje == 75) Kad bi se deklaracija klase
{ nalazila u drugačije nazvanoj koda
datoteci, npr. datoteci naziv.h,
setcolor (WHITE); morali bismo napisati:
rectangle(x, 432, x+60, 438);
setcolor (BLACK); #include "naziv.h"
x = x - 5;
} Naziv datoteka možemo birati,
if (kretanje == 77) a nastavak h je obvezan. Naš
{ program naredbom:
setcolor (WHITE);
rectangle(x, 432, x+60, 438); #include <winbgim.h>
setcolor (BLACK);
x = x + 5; uključuje samo grafičku biblio-
} teku jer druge biblioteke ne
} koristimo. Da npr. nešto raču-
void objekt :: crtaj() namo morali bismo nared-
{ bom:
rectangle(x, 432, x+60, 438);
} #include <cmath>
PRO - MIL uključiti i matematičku biblio-
teku.
295
Veliki programi
U datoteku objekt.h unosimo
deklaraciju klase objekt.
#ifndef OBJEKT_H I ova deklaracija klase započinje naredbom
#define OBJEKT_H #ifndef i naredbom #define iza kojih se nalazi
naziv datoteke u kojoj je deklaracija klase.
class objekt Budući da se deklaracija klase objekt nalazi
{ u datoteci objekt.h iza naredbe #ifndef i na-
redbe #define, piše se OBJEKT_H.
private: Kad bi se deklaracija klase nalazila npr. u
int x; datoteci klasa.h, ovaj dio imao bi oblik:
char kretanje; #ifndef KLASA_H
#define KLASA_H
public:
objekt() Naredbu #endif pisat ćemo na kraju svake
{ datoteke koja počinje naredbom #ifndef.
x = 290;
} PRO - MIL
void pomak(char);
void crtaj();
};
#endif
296
Glavni program se u ovoj C++ programiranje za apsolutne početnikePetlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
inačici razlikuje od inačice
koja se cijela nalazi u jednoj #include <cstdlib> odluke
datoteci po tome što u ovoj #include <iostream>
inačici moramo osim: #include <winbgim.h>
#include <ctime>
#include <cstdlib>
#include <iostream> using namespace std;
#include <winbgim.h>
#include "objekt.h"
dodati i naredbe: #include "bomba.h"
#include "objekt.h" int main()
#include "bomba.h" {
kojima se u program uklju- int gdriver = 9;
čuju datoteke koje sadrže int gmode = 2;
deklaracije klase objekt i initgraph(&gdriver, &gmode, "");
klase bomba. setbkcolor(WHITE);
setcolor(BLACK);
Glavni program nalazi se cleardevice();
u datoteci mani.cpp. char odgovor = 'd';
srand(time(NULL));
bomba bomba1, bomba2, bomba3; Polja
objekt brod;
brod.crtaj(); Sažimanje Veliki pro- Objekti Obrada teksta
do
{ grami
bomba1.brisanje();
bomba2.brisanje();
bomba3.brisanje();
bomba1.crtanje();
bomba2.crtanje();
bomba3.crtanje();
delay(2);
if (kbhit())
{
odgovor = getch();
brod.pomak(odgovor);
}
brod.crtaj();
}
while (odgovor != 'k');
return 0;
}
koda
PRO - MIL 297
Veliki programi Rezultat izvođenja
našeg programa iz-
298 gledat će otprilike
ovako.
Ovo su “bombe” koje
se kreću odozgo pre-
ma dolje.
Ovo je “brod” koji
strelicom lijevo mo-
žemo pomicati u lije-
vu stranu i strelicom
desno u desnu stra-
nu.
Prilikom prvog prevođenja i pok-
retanja ovog programa program-
ska okolina će nas upozoriti da
je došlo do pretvaranja varijable
float tipa u varijablu int tipa.
Upozorenje ćemo zanemariti,
budući da to nije greška, već
smo to učinili namjerno prilikom
generiranja slučajnog broja.
Prilikom sljedećeg prevođenja i
pokretanja programa ovo upozo-
renje se više neće pojavljivati.
PRO - MIL
C++ programiranje za apsolutne početnike
main.cpp U ovom shematskom prika- Petlje Donošenje Grafika Varijable Naš prvi Uvod Sadržaj program
zu našeg programa može-
using namespace std; mo vidjeti logiku po kojoj se
#include "objekt.h" program podijeljen u više
#include "bomba.h" datoteka povezuje u jednu
int main() cjelinu.
{
Koristeći ovu logiku, može-
GLAVNI PROGRAM; mo daleko veći program
} razdijeliti na veći broj dato-
teka.
objekt.h
bomba.h odluke
#ifndef OBJEKT_H
#define OBJEKT_H #ifndef BOMBA_H Polja
class objekt #define BOMBA_H
{
class bomba
DEKLARACIJA KLASE; {
};
#endif DEKLARACIJA KLASE;
objekt.cpp };
#include "objekt.h" #endif
void objekt :: pomak(char tipka)
{ bomba.cpp Sažimanje Veliki pro- Objekti Obrada teksta
SADRŽAJ OBJEKTA; #include "bomba.h" grami
}
void objekt :: crtaj() void bomba :: crtanje() koda
{ {
SADRŽAJ OBJEKTA; SADRŽAJ OBJEKTA;
} }
PRO - MIL void bomba :: brisanje()
{
SADRŽAJ OBJEKTA;
}
299
Sažimanje koda
300 PRO - MIL