Forum Sveta kompjutera

Nazad   Forum Sveta kompjutera > Test Run > Programiranje > Pravljenje igara

Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara...

Odgovor
 
Alatke vezane za temu Vrste prikaza
Stara 11.9.2006, 10:06   #241
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 4.147
Zahvalnice: 651
Zahvaljeno 1.361 puta na 698 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Ajmo sada klase.Evo objasnjenja koje ce svi razumeti.Klasa je na primer pas.Klasa pas obuhvata promenljive koliko pas ima godina, dal je musko ili zensko itd.,metodi za hodanje, spavanje da treba da jede itd.Svaki pojedini pas je instanca klase pas tj. objekat.Recimo mi smo svi instance klase coveka(uporedjivanje sa realnim zivotom mi najlakse za objasnjivanje ).Znaci klasa je npr. pas a kucovi koji nas nerviraju po ulici su reprezentativni primerci te klase.Evo jednostavne deklaracije klase:
Kod:
class Dog
{
public:
    Dog();
    ~Dog();
    void Bark();
    int GetAge(){ return itsAge;}
private:
    int itsAge;
};
Linija po linija.Kljucna rec class oznacava da deklarisemo klasu(il' definisemo uvek me za*ebavaju ta dva pojma).Rec posle nje je ime klase.Sledi viticasta zagrada.Sledeca kljucna rec je public posle koje ide dvotacka.public znaci da svako moze pristupiti metodima i clanicama koje su javne.Sada verovatno se pitate sta je Dog() i ~Dog().To su konstruktor i destruktor koji se pozivaju pri pravnjenu odnosno unistavanju objekta.Bark je cuveni metod Meow za klasu Cat.Videce te sta radi.GetAge vraca broj godina(tj. itsAge).Njegova implementacija metoda je inline(u fazonu #define).Sledeci deo je private.To znaci da ne mozemo pristupiti tim metodima i clanicama.Pitate se verovatno sto.To je da drugi objekti ne mogu brljati po delovima nekog objekta.Za to postoje pristupni metodi(kao sto je nas GetAge).Oni nam omogucuju pristup.Ovo stavite u dog.h Sada implementacija metoda:
Kod:
#include <iostream>
using namespace std;
#include "dog.h"

Dog::Dog
{
    cout << "Dog constructor" << endl;
    itsAge = 4;
}

Dog::~Dog();
{
    cout << "Dog destructor" << endl;
}

void Dog::Bark()
{
    cout << "Bau vau" << endl;
}

int main()
{
cout << "Welcome!" << endl << endl;
Dog doggie;
cout << "Doggie's age is: " << doggie.GetAge() << endl;
return 0;
}
Vecinu koda znate al' da objasnim sta ne znate.Implementacija metoda ide: povratni_tip ime_klase::metod_klase Posto kontruktor i destruktor nemaju tip deo povratni_tip je prazan.Mozete izostaviti konstruktor i destruktor i tada se pozivaju podrazumevani.I metodima i clanicama objekata neke klase se pristupa:
1.U slucaju "obicnog" ime_objekta.ime_metoda
2.U slucaju pointer objekta ime_objekta->ime_metoda
Sto ne bude jasno pitajte na shadowfilip@hotmail.com
Andross je offline   Odgovor sa citatom ove poruke
Stara 11.9.2006, 10:31   #242
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.195
Zahvalnice: 2.106
Zahvaljeno 4.941 puta na 2.873 poruka
Određen forumom Re: objasnjenja pocetniku

Bolja je praksa primerke klase alocirati u dinamičkoj zoni memorije a ne steku.
Dakle
Kod:
int main()
{
cout << "Welcome!" << endl << endl;
Dog *doggie = new Dog();
cout << "Doggie's age is: " << doggie.GetAge() << endl;
delete doggie;
return 0;
}
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 11.9.2006, 12:52   #243
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 4.147
Zahvalnice: 651
Zahvaljeno 1.361 puta na 698 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

I onda ne pozoves:
Kod:
doggie.GetAge()
vec:
Kod:
doggie->GetAge()
Andross je offline   Odgovor sa citatom ove poruke
Stara 11.9.2006, 16:34   #244
voodoo_
V.I.P. GNU/Linux
 
Avatar korisnika voodoo_
 
Član od: 1.11.2005.
Poruke: 11.195
Zahvalnice: 2.106
Zahvaljeno 4.941 puta na 2.873 poruka
Određen forumom Re: objasnjenja pocetniku

Eto vidiš kako znaš
A da ne ispadne da ja ne znam, doggie->GetAge() je isto što i (*doggie).GetAge()
voodoo_ je offline   Odgovor sa citatom ove poruke
Stara 12.9.2006, 10:36   #245
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 4.147
Zahvalnice: 651
Zahvaljeno 1.361 puta na 698 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Znam.Al' nisi stavio (*doggie).Mada dosta o nasem kucovu imam jedno programersko pitanje za vas.Odgovor doduse znam ali zelim cuti vase misljenje.
Pitanje: Imate varijablu broj sa vrednoscu 1 ili 2.Ako je broj 1 promeniti ga u 2, ako je 2 promeniti ga u 1.Ajd sad.Zelim da vidim efikasne kodove.Kada zavrsimo recicu vam moj odgovor.

P.S. Pricam to jer mladjani programeri(po iskustvu) verovatno ne znaju sta su pointeri.
Andross je offline   Odgovor sa citatom ove poruke
Stara 12.9.2006, 19:13   #246
sucur_87
Član
 
Član od: 2.12.2005.
Lokacija: Istocno Sarajevo - Republika Srpska
Poruke: 69
Zahvalnice: 0
Zahvaljeno 0 puta na 0 poruka
Slanje poruke preko MSN-a korisniku sucur_87
Određen forumom Re: objasnjenja pocetniku

Citat:
ANDROSS kaže:
Znam.Al' nisi stavio (*doggie).Mada dosta o nasem kucovu imam jedno programersko pitanje za vas.Odgovor doduse znam ali zelim cuti vase misljenje.
Pitanje: Imate varijablu broj sa vrednoscu 1 ili 2.Ako je broj 1 promeniti ga u 2, ako je 2 promeniti ga u 1.Ajd sad.Zelim da vidim efikasne kodove.Kada zavrsimo recicu vam moj odgovor.

P.S. Pricam to jer mladjani programeri(po iskustvu) verovatno ne znaju sta su pointeri.
Kod:
if(broj == 2 ? broj = 1 : broj = 2);
sucur_87 je offline   Odgovor sa citatom ove poruke
Stara 12.9.2006, 20:21   #247
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Citat:
if(broj == 2 ? broj = 1 : broj = 2);
Ovo je delimično prebukiran izraz Ternarni operator bi u slučaju da je ANDROSS mislio da se provera vrši samo jednom bio sasvim okej ali prethodni problem mora biti predstavljen ovako:

Kod:
#include<iostream>
using namespace std;

main(){
    int broj = 1;
    (broj = (broj == 2)) ? broj = 1:broj = 2;
    cout << broj; 
    fflush(stdin);
    cin.get(); 
}
Znači, rezultat ternarnog operatera MORA biti prosleđen promenjljivoj a if petlja je u datom primeru totalno nepotrebna i ne služi ničemu osim zauzimanju procesorskog vremena

Poslednja ispravka: holodoc (12.9.2006 u 22:35)
holodoc je offline   Odgovor sa citatom ove poruke
Stara 14.9.2006, 10:25   #248
Andross
Kekule Mekule
 
Avatar korisnika Andross
 
Član od: 8.12.2005.
Lokacija: Beograd
Poruke: 4.147
Zahvalnice: 651
Zahvaljeno 1.361 puta na 698 poruka
Slanje poruke preko Skypea korisniku Andross
Određen forumom Re: objasnjenja pocetniku

Moj je kod nabrzi, najmanji, najprakticniji i uopste nije skup!!!!
Kod:
broj = 3 - broj;
Ko bi se ovoga setio a?
Andross je offline   Odgovor sa citatom ove poruke
Stara 14.9.2006, 14:58   #249
MG-RAY
Starosedelac
 
Član od: 15.2.2006.
Lokacija: Midlands
Poruke: 1.523
Zahvalnice: 277
Zahvaljeno 307 puta na 207 poruka
Slanje poruke preko Skypea korisniku MG-RAY
Određen forumom Re: objasnjenja pocetniku

Citat:
ANDROSS kaže:
Moj je kod nabrzi, najmanji, najprakticniji i uopste nije skup!!!!
Kod:
broj = 3 - broj;
Ko bi se ovoga setio a?
gde mi ode onaj smiley...a, evo ga...

u pravu si...ko bi se setio...
MG-RAY je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 0:59   #250
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Nije da vas kritikujem ali ljudi pogledajte još jednom naziv teme Tema se zove „objašnjenje početniku“ sa naglaskom na reč početniku Malo je verovatno da će neko ko se nikada ranije nije susreo sa C++-om ukapirati o čemu se ovde radi ako objašnjenja „gaze“ preko nekih komplikovanih naziva i tehnika. Ova tema bi pre svega trebala da pruži objašnjenja i primere koje može da svari svako ko je bar malo pratio temu ili ima bar neko početno znanje iz bilo kog programskog jezika mada bi trebala da bude pojmljiva čak i apsolutnom početniku.

Zbog toga sam na ovom mestu hteo da pružim jedan opširniji tutorijal vezan za definiciju i korišćenje najmoćnijeg oružija koje C++ poseduje a to su naravno klase. Tekst koji sledi će usput demonstrirati i primenu još nekih tehnika koje su često u upotrebi kao i načine programiranja tako da ovako na početku jedino mogu da dam garanciju da će tekst biti izuzetno koristan svakome ko želi da nauči C++ „kako se valja“. Da pređemo odmah na stvar.

Kao što sam već nekoliko puta do sada rekao klase i njihove osobine predstavljaju stub onoga što C++ čini jednim od najmoćnijih, ako ne i najmoćnijim programskim jezikom uopšte. Pod ovim prevashodno podrazumevam brzinu kojom je moguće „naterati“ neki kod da se izvršava odnosno njegovu optimizovanost za određenu vrstu zadatka. Klase vode poreklo iz teorije objekto-orijentisanog programiranja i pojavile su se mnogo ranije u nekim starijim programskim jezicima kao što je npr. „Simula“. Osnovna ideja prilikom njihovog uvođenja u C++ je bila da se moćna sintaksa (način programiranja) C programskog jezika kombinuje sa logičnijim pristupom rešavanja problem koje nude klase. Treba odmah na početku shvatiti da bez poznavanja načina na koji klase funkcionišu i moćnih mogućnosti koje nude (osobina višestrukog nasleđivanja itd.) C++ je ništa drugo do najobičniji C programski jezik. Dokaz za ovo je i činjenica da je Bjarne Stroustrup (tvorac C++-a) prilikom prvog krštenja jezika iskoristio naziv “C sa klasama”. Da razgraničimo jednu stvar, daleko od toga da je C slab (u to nas uverava bezbroj projekata koji se izrađuju uz njegovu pomoć) ali jednostavno C u nekim slučajevima nije dorastao ogromnim projketima ili u slučajevima kada na nekom projektu radi ogroman broj ljudi. U oba slučaja najveći problem predstavlja kako omogućiti dobru integraciju celog tima odnosno kako obezbediti da više ljudi može nesmetano da odrađuje svoj deo projekta a da među njima ne dođe do problema prilikom povezivanja svih tih delova u jednu celinu. Klase upravo obezbeđuju da vi kao programer recimo ne morate da znate kako je tamo neki vaš kolega odradio klasu koju nameravate da koristite u svom delu programa. Bitno je da je kolega vama pružio opis date klase tj. članice promenjljive te klase a ponekad je sasvim dovoljno poznavati samo njene metode. O svim ovim terminima naravno malo kasnije a sada se samo pominju ilustracije radi.
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 0:59   #251
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Još jedan jako bitan faktor ili bolje reći pozitivna osobina uvođenja klasa jeste jednostavnost velikih revizija odnosno izmena koda. U C++-u je dovoljno izmeniti strukturu neke klase i sve u njoj navedeno će se odnositi na objekte koji su na osnovu nje definisani. Jednostavno rečeno, veliki projekti danas zahtevaju način da se na brz i jednostavan način pristupi izmeni koda a klase to pružaju na veoma jednostavan način.

Šta je u suštini klasa i kako je razlikovati od tzv. objekata? Ovu razliku je veoma važno shvatiti jer veoma često, baš zbog mešanja ova dva termina, nastaju problemi. Klasu najjednostavnije treba posmatrati kao vrstu. Iako ovo zvuči možda malo konfuzno i nepotrebno ako malo pokrenete vijuge u vezi ove poslednje konstatacije shvatićete da ovako nešto čak i ima smisla. Evo primera radi recimo da vas vaš komšija upita koje je vrste (ili ako više volite rase) vaše kuče a vi mu odgovorite „čivava“. Verovali ili ne komšiji ste upravo rekli kojoj klasi vaše kuče pripada. E sada ako se komšija obraduje i kaže „Jao super i ja imam čivavu“ a vi ga upitate za ime njegovog kučeta, na šta vam on odgovara „Ubica“ , verovali ili ne vaš komšija vam je rekao ime objekta koji pripada klasi (vrsti, rasi) „čivava“. Znači, objekat treba shvatiti kao jedinku (u ovom slučaju kuče „Ubica“) koja pripada klasi „čivava“. Sada se normalno komšija zainteresuje za vaše kuče pa onako „čisto usput“ upita kako se ono zove na šta vi normalno odgovarate „Ubice jedem za večeru“ Šalim se naravno. Recimo da vašem kučetu damo ime „Šerpa“ Znači, „Ubica“ i „Šerpa“ čine dva objekta iz klase „čivava“.

Sada je na redu da razjasnimo šta su to „članice promenjljive“ odnosno „metode“ klasa.

Naša mala priča vezana za vašu i čivavu vašeg komšije se nastavlja. Komšija, naravno da vas preduhitri u celom tom prepucavanju, odmah upita koliko je vaš „Šerpa“ star na šta vi odgovarate nešto u fazonu 77 godina. Da ne ostanete dužni vi sada upitate komšiju koje boje je dlaka njegove džukele, pardon kuce, i dobijate naravno odgovor „zagasito crvena“. E upravo ovi podaci kao što su starost i boja dlake predstavljaju nešto što se zove „member variables“ ili u slobodnom domaćem prevodu „članice promenjljive“ klase. Ove promenljive treba u stvari shvatiti kao osobine koje su karakteristične za neku klasu (u ovom slučaju starost i boja dlake).
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:01   #252
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

U nastavku priče vi i vaš komšija razmenjujete informacije o tome šta vaši mezimci znaju da urade. Vaš komšija navodi da njegov „Ubica“ ume da laje, da stoji na dve ruke tj. šape, spava, cepa nameštaj, raznosi obuću, „olakšava se“ po tepihu i naravno „tamani“ komšiji kokoške U ovoj konstataciji se naravno složite obojica.

Upravo ove sposobnosti klase, odnosno skup stvari koje klasa može da uradi, nazivaju se metode. Razmislite malo o ovom pristupu. Umesto da se kao kod proceduralnih jezika koriste striktno veštački definisane strukture podataka koje naravno imaju svojih nedostataka C++ prilazi rešavanju problema na logičniji i prirodniji način jer ono što nam je definitvno logično to je da ako želimo da opišemo neku osobu uzmemo u obzir njene opšte osobine i šta ona može da uradi. Ako bi vas neko zamolio da mu opišete bolid Mihaela Šumahera mogli bi ste podatake o boji, snazi motora i recimo broju tablica smestiti u članice promenjljive klase „bolidi“. Ono što bolid može da uradi, primera radi da krene, stane ili slupa se, predstavljamo metodama te klase. I uvek je po potrebi, bez obzira na ostatak koda moguće dodati odnosno oduzeti članice promenjljive ali naravno samo u deklaraciji klase tj. nije moguće vršiti promenu izgleda klase u toku izvršavanja koda. Šta? Bolid nema tablice? Pa u našem modelu (klasi) možemo malo da se poigramo maštom i dodamo i ovu promenjljivu ali ne moramo uopšte da je koristimo

Kada rezimiramo sve upravo rečeno dolazimo do zaključka kako bi otprilike trebala da izgleda klasa „čivava“.U ovom slučaju „Ubica i „Šerpa“ su objekti koji pripadaju klasi „čivava“ i imaju „članice promenjljive“ „starost“ i „boja dlake“ odnosno metode „lajanje“, „spavanje“ i recimo „stajanje“. Izostavićemo za početak ove radnje koje nisu za pohvalu

Pošto sada znamo kako treba da izgleda naša klasa red je da se bacimo malo i na programiranje i vidimo kako se klasa deklariše u C++-u. Evo kako bi naša klasa „civava“ trebala da izgleda prilikom deklaracije. BTW, nemojte se truditi da sledeći kod kompajlirate jer mu fali ostatak
Kod:
class Civava {
	public:
		void lajanje();
		int spavanje();
		void stajanje(int broj_sapa);
	private:
		int starost;
		char boja_dlake[];
	protected:
		char falinka[];
};
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:02   #253
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Ključna reč „class“ priprema kompajler da prihvati podatke koje slede kao deklaraciju klase odnosno u ovom slučaju čivave. Sledi ime „civava“, nakon čega postoji par sekcija u kojima se deklarišu promenjljive koje će ili biti vidljive ostatku programa ili će ostati vidljive samo u okviru svoje klase.

U prethodnom primeru sve promenjljive („starost“ i „boja_dlake“) odnosno metode („lajanje“, „spavanje“, „stajanje“) koje su definisane posle ključne reči „public“ biće javno dostupne ostatku programa. Sve što je definisano posle ključne reči „private:“ biće vidljivo samo unutar klase ali u smislu da je podatke odnosno metode moguće „prošvercovati“ van klase putem specijalnih metoda koji se zovu „accessor-i“. Na kraju sve što se nalazi u okiviru „protected:“ sekcije ne može ni na koji način da bude upotrebljeno van klase.

Da malo pojasnim stvari poštoje ovaj deo naleteo malo u stilu “iz neba pa u rebra“. Pođimo od toga šta je jedna od velikih prednosti klasa – sprečavanje pojave grešaka u toku izvršavanja koda. Drugim rečima, na programeru je uvek bilo (i jeste i biće) da predvidi sve moguće probleme koji mogu da se jave tokom eksploatacije aplikacije. Greške koje se jave prilikom razvoja (i njih prijavljuje kompajler) nisu opasne jer programer može veoma brzo da uvidi gde je pogrešio i da datu grešku ispravi pošto kao rezultat svake kritične greške u kodu dolazi do toga da kompajler prekida sa daljim kompajliranjem. Znatno opasniji deo predstavljaju greške koje se javljaju tokom pokretanja aplikacije (tzv. „runtime errors“) i koje često ne izazivaju krahiranje programa već jednostavno njegovo nepravilno funkcionisanje. Najčešća greška ovog tipa problema jeste korišćenje globalnih promenjljivih, odnosno promenjljivih, koje su dostupne svim ostalim delovima programa. Opasnost u ovakvoj situaciji leži u činjenici da je veoma lako slušajno promeniti vrednost neke promenjljive koja se nalazi u „public:“ delu klase i da dođe do greške zbog neželjene promene vrednosti. Zato je opšte pravilo dobrog programiranja da se sve „članice promenjljive“ klasa postavljaju da budu u „private:“ delu jer su tako dostupne samo metodama u sopstvenoj klasi. Ovde treba voditi računa o razlici između „protected“ i „private“ deklaracija. Dok postavljanje promenjljive ili metode u okviru „private“ sekcije znači da je vrednosti promenjljivih moguće očitati i van klase (ali samo preko specijalnih metoda koje se nazivaju „accessor-i“ ili prihvatni metodi) „protected“ metod ne dozvoljava ama baš nikakvu vrstu rabote sa istim ako ih ne „obrađuje“ metoda iz klase čije su sastavni deo. U suštini, u „public“ sekciju svake deklaracije klase treba da idu samo metode koje će biti dostupne ostatku programa dok se članice promenjljive stavljaju isključivo u „private“ sekciju.
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:02   #254
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

„Protected“ deo je uglavnom rezervisan za stavke koje ni u kom slučaju ne smeju da dospeju van klase. U ovom primeru u „protected“ sekciju je stavljena promenjljiva „falinka[]“ koja je u stvari niz karaktera tj. najverovatnije će sadržati neki string. U njoj može recimo biti zapisano „boluje od neizlečive bolesti“ ili sl. Znači ovaj podatak treba da zna samo objekat („Ubica“ ili „Šerpa“), koji naravno pripadaju klasi „čivava“. Da ne bude zabune, čak ni „Šerpin“ gazda ne bi trebalo da zna za falinku već samo „Šerpa“. Takođe važi da nijedan objekat (čak ni oni koji pripadaju istoj klasi) ne mogu da „vide“ jedan drugome „private“ deo. Znači „Šerpa“ ne može da vidi šta je „Ubici“ falinka što naravno važi i obratno. Sve ovo proizilazi iz činjenice da kada se objekat „napravi“ on dobija jedinstveni memorijski prostor za svaku promenjljivu tako da ako imate pet objekata za svaki od njih će biti rezervisan poseban deo memorije tj. biće nezavisni bez obzira što su deklarisani istom klasom.

Kako se uopšte deklariše objekat koji pripada nekoj klasi? Jednostavno. Sledeći primer demonstrira kako se deklarišu „Ubica“ i „Šerpa“ kao pripadnici već pomenute klase „civava“. Sledeći kod je potpuno funkcionalan.
Kod:
#include<iostream>
using namespace std;

class Civava { //deklarisanje klase "civava"
    // sledeci deo moze da vidi bilo koji deo programa
    public: 
        void lajanje(); 
        int spavanje();
        void stajanje(int broj_sapa); //ova metoda prihvata i parametre
    // sledeci deo moze da vidi ostatak programa ali samo koriscenjem accessora klase
    private:
        int starost;
        char boja_dlake[];
    // sledeci deo moze da vidi samo klasa civava
    protected:
        char falinka[];  
};

int main(){
    Civava Ubica; // ovde "pravimo" objekat "Ubica"
    Civava Serpa; // naravno ovde "pravimo" objekat "Serpa"
    
    // sledeci kod cisto nostalgije radi ;)
    fflush(stdin);
    cin.get();
    return EXIT_SUCCESS;
}
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:04   #255
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Kada ovaj kod „provučete“ kroz kompajler shvatite da je ovo u stvari puno koda bez ikakvog rezultata. Da li je? Vaš kompajler je napravio klasu „Civava“ i dva objekta tj. „Ubicu“ i „Šerpu“ kao objete tipa (rase) „civava“. To je poprilično posla jer je u isto vreme kompajler za svaki od ovih objekata rezervisao mesta za skladištenje podataka koji su opisani u „private“ sekciji deklaracije klase. Svakoj od tih promenjljivih se pristupa tako što se napiše ime objekta nakon čega sledi „.“ i naziv promenjljive odnosno metode kojoj pristupamo.

To se primera radi može uraditi jednostavnim navođenjem sledećih programskih linija u „main()“ funkciji:
Kod:
Ubica.starost = 77;
Ubica.boja_dlake = „crvena“;
Ukoliko ove redove ubacite u prethodni kod kompajler će prijaviti grešku upravo zbog onoga što je već rečeno u vezi vidljivosti delova klase. Program ne može da pristupi promenjljivama „starost“ i „boja_dlake“ iz jednostavnog razloga što su obe proglašene kao vidljive isključivo od strane svoje klase (civava) u onoj sekciji „private“.

Da bi se ovakav problem prevazišao i da bi se rešio problem nezavisnosti podataka u okviru klase od njenih metoda gotovo svakoj klasi se dodaju metode u „public“ delu koje služe za pristup članicama promenjljivih u klasi. Ove metode se nazivaju „accessori“ ili „pristupne metode“. One služe da omoguće ostatku programa da pristupi promenjljivama klase. Accessor metode se definišu u okviru „public“ dela deklaracije klase. Evo primera a kasnije i objašnjenja šta je konkretno urađeno i kako je pristup omogućen.

Kod:
#include<iostream>
using namespace std;
typedef unsigned short int USHORT;

class Civava { //deklarisanje klase "civava"
    // sledeci deo moze da vidi bilo koji deo programa
    public: 
        void lajanje(); 
        USHORT spavanje();
        void stajanje(USHORT broj_sapa); //ova metoda prihvata i parametre
        USHORT Starost_Ocitavanje();
        void Starost_Postavljanje(USHORT godina);
    // sledeci deo moze da vidi ostatak programa ali samo koriscenjem accessora klase
    private:
        USHORT starost;
        char boja_dlake[];
    // sledeci deo moze da vidi samo klasa civava
    protected:
        char falinka[];  
};

int main(){
    Civava Ubica; // ovde "pravimo" objekat "Ubica"
    Civava Serpa; // naravno ovde "pravimo" objekat "Serpa"
    
    cout << Ubica.Starost_Ocitavanje() << endl; //ispis broja godina Ubice
    Ubica.Starost_Postavljanje(77);
    // sledeci kod cisto nostalgije radi ;)
    fflush(stdin);
    cin.get();
    return EXIT_SUCCESS;
}
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:05   #256
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Prvih par linija koda bi već valjda trebalo da bude razumljivo a ako to nije slučaj slobodno prelistajte ovu temu od početka.

Prvu novost koju do sada nismo ovde spominjali predstavlja red:
Kod:
typedef unsigned int USHORT;
Ovo je još jedan način da se skrati pisanje programa u C-u i C++-u. Iako se ovde ne radi o čistoj zameni podataka u toku procesa kompajliranja, koje radi pretprocesorska direktiva „#define“ ovaj red bukvalno treba shvatiti kao uvođenje pravila da se na svakom mestu u kodu gde se pojavi reč „USHORT“ vrši zamena sa „unsigned int“. Naime, za razliku od „#define-a“ koji jednostavno zamenjuje reči u kodu u toku procesa kompajliranja (slično kao „Find/Replace“ u Word-u) „typedef“ služi za definisanje novih tipova podataka o kojima ovde neću naravno nešto posebno detaljisati.

Kao još jednu korisnu napomenu u vezi tipova podataka naveo bih i to da je veoma važno da svako ko bude imao nameru da se ozbiljnije bavi programiranjem treba dobro da shvati u kom slučaju će koji tip podataka da koristi. Korišćenje pravog tipa podatka u pravo vreme znatno ubrzava izvršenje programa i štedi resurse dok sa druge strane izbor pogrešnog tipa podataka može da napravi „pokolj“ u memoriji. Primera radi ovde sam definisao novi tip podatka koji nosi naziv „USHORT“ i jednostavno predstavlja ništa drugo nego „kratki“ celobrojni broj bez znaka. To znači da će za sve promenjljive koje se definišu da budu ovog tipa biti rezervisan određen prostor u memoriji i to u zavisnosti od arhitekture samog računara na kome se kod izvršava. Primera radi, možete da iskoristite sledeći kod da bi ste videli koliko na vašem računaru kompajler rezerviše mesta u memoriji za svaki od navedenih tipova podataka.
Kod:
#include <iostream>
using namespace std;

int main(){
    cout << "Int: \t\t"    << sizeof(int)    << " bajtova.\n";
    cout << "Short int:\t" << sizeof(short)  << " bajtova.\n";
    cout << "Long int:\t"  << sizeof(long)   << " bajtova.\n";
    cout << "Char:\t\t"    << sizeof(char)   << " bajtova\n";
    cout << "Float:\t\t"   << sizeof(float)  << " bajtova.\n";
    cout << "Double:\t\t"    << sizeof(double) << " bajtova.\n";
    fflush(stdin);
    cin.get();
    return EXIT_SUCCESS;
}
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:07   #257
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Veličina svakog podatka u ovom programu se ispisuje u bajtovima tako da možete veoma jednostavno da uporedite koliku uštedu prostora u ovom slučaju činite. Primera radi, na Athlon 64 procesoru običan „int“ je predstavljen sa 4 bajta što znači da pomoću njega možete predstaviti maksimalno „2 na 32.“ različitih celobrojnih vrednosti. Pošto „short int“ zauzima samo pola prostora po promenjljivoj (2 bajta) to znači da ako bi smo u ovom slučaju umesto „int-a“ uspeli da iskoristimo „short int“ da bi smo ostvarili uštedu memorisjkog prostora od 50%!!!! Ovde u konkretnom primeru to nije problem jer ako bi smo imali dva objekta za koje bi smo čuvali starost u „int“ tipu promenjljive u tom slučaju bi bilo potrebno samo 8 bajta prostora u memoriji (4 bajta za starost „Ubice“ i 4 bajta za starost „Šerpe“). Problem je najbolje demonstrirati u slučajevima kada se barata sa velikim brojem podataka u isto vreme. Zamislite da recimo imate jedan niz od 100 000 elemenata tipa „int“. Znači, ako pretpostavimo da je veličina „inta“ u memoriji 4 bajta u tom slučaju bi pun niz u memoriji zauzimao 400 000 bajtova tj. oko 390 KB. Ako bi umesto „int-a“ projekt dozvoljavao upotrebu „short int-a“ u tom slučaju bi nam za smeštanje podataka bilo potrebno tačno pola tj. 195 KB prostora u memoriji što je kao što rekoh 50% uštede. Imajte ovo na umu kada dođete u situaciju da radite optimizaciju koda.

Logično se sada postavlja pitanje zašto ne koristiti uvek „short int“ tip podataka umesto „int-a“. Razlog je jednostavan i zove se opseg brojeva. Već je rečeno da neke promenjljive moraju da se definišu tako da mogu da prime određenu veličinu broja na sebe. Primera radi, promenjljiva koja je definisna da sadrži „int“ tip podatka bi na mašini na kojoj „int“ zauzima“ 4 bajta mogla da sadrži 4294967296 kao najveći broj (ovaj broj se dobija jednostavno po formuli „2 na broj_bajtova_za_tip). „Short int“ bi mogao da sadrži kao najveći broj „tek“ 65536 kao najveći broj. Obratiti pažnju da polovina rezervisanih bitova za tip podataka ne predstavlja polovinu raspoloživih brojeva jer se vrši dizanje na stepen.

Dodatak „unsigned“ u svim slučajevima int tipa podataka znači da se ne računaju negativni brojevi odnosno da se koriste samo opseg nenegativnih (0 i svi pozitivni) brojeva. Ovo omogućava programeru da koristi ceo opseg za dati tip podataka. Ukoliko se tip definiše bez „unsigned“ reči ili se eksplicitno doda „signed“ ukupan broj brojeva koji može da se koristi je ravan polovini maksimalnog jer se pola „troši“ na negativne brojeve“.
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:10   #258
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Da se vratimo na klase.

U odnosu na prethodni kod sada imamo određene dodatke. Prvi je sledeći:
Kod:
USHORT Starost_Ocitavanje();
void Starost_Postavljanje(USHORT godina);
Ovo su već pomenuti „accessori“ koji imaju zadatak da odvoje metode u kodu od promenjljivih. Upravo ovo je još jedna bitna pozitivna osobina C++ programskog jezika jer ovakav pristup omogućava nesmetanu nadogradnju projekta bez preteranog zalaženja u probleme odnosa između promenjljivih i metoda.

Prvi accessor „Starost_Ocitavanje()“ treba da kao povratnu vrednost prosledi vrednost promenjljive koja je jedino vidljiva klasi „Civava“. Znači njegova funkcija je ta da ostalom delu koda učini dostupnu vrednost promenjljive „starost“ jer smo već rekli da „starost“ pripada skupu privatnih (čitaj nevidljivih za ostali deo koda) promenjljivih. Drugi accessor služi za postavljanje vrednosti te iste promenjljive i kao argument prima broj godina koji je USHORT tipa.

Sledeće pitanje je naravno gde je u ovom kodu definisano koju će vrednost accesori vraćati kao rezultat poziva i gde će spoljašnji program moći da upisuje podatke u te promenjljive koje klasa krije kao zmija noge. Tačan odgovor je nigde Za tako nešto je potrebno da napravimo definicije accessora odnosno da definišemo šta će koji accessor tačno da radi. Ovo treba shvatiti kao postupak veoma sličan definiciji funkcija ako se naravno uzmu u obzir par izuzetaka koji slede u nastavku teksta.

Definisanje metoda accessor-a možemo vršiti na dva načina. Jedan je klasičan a drugi je tzv. „inline“ metod. Shvatiti razliku kada koji treba koristi je veoma važno jer se na taj način štedi procesorsko vreme u toku izvršavanja programa. No, prvo ide primer u kome ćemo definisati accesore klasičnim putem. Definisanje klasičnim putem se vrši sledećim blokom koji je apsolutno identičan kao i definicija bilo koje metode jer su accessori ništa drugo do metode sa specifičnim zadatkom.
Kod:
Ime_klase::naziv_metode_odnsono_accessora {

}
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:12   #259
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

U konkretnom slučaju da bi smo napravili accessor-e za „Civavu“ treba da napišemo sledeći kod.

Kod:
#include<iostream>
using namespace std;
typedef unsigned short int USHORT;

class Civava { //deklarisanje klase "civava"
    // sledeci deo moze da vidi bilo koji deo programa
    public: 
        void lajanje(); 
        USHORT spavanje();
        void stajanje(USHORT broj_sapa); //ova metoda prihvata i parametre
        USHORT Starost_Ocitavanje();
        void Starost_Postavljanje(USHORT godina);
    // sledeci deo moze da vidi ostatak programa ali samo koriscenjem accessora klase
    private:
        USHORT starost;
        char boja_dlake[];
    // sledeci deo moze da vidi samo klasa civava
    protected:
        char falinka[];  
};

USHORT Civava::Starost_Ocitavanje(){ //accessor za prosledjivanje broja godina civave
    return starost; //ocitaj privatnu promenjljivu i prosledi vrenost pozivacu  
}

void Civava::Starost_Postavljanje(USHORT godina){ //accessor za postavljanje vrednosti godina civave
    starost = godina; //neka privatna promenjljiva dobije vrednost promenjljive godina          
}

int main(){
    Civava Ubica; // ovde "pravimo" objekat "Ubica"
    Civava Serpa; // naravno ovde "pravimo" objekat "Serpa"
    
    cout << Ubica.Starost_Ocitavanje() << endl; //ispis broja godina Ubice
    Ubica.Starost_Postavljanje(77); //postavljamo novu vrednost preko accessora
    cout << Ubica.Starost_Ocitavanje() << endl; //sada ponovo ispisujemo vrednosti
    // sledeci kod cisto nostalgije radi ;)
    fflush(stdin);
    cin.get();
    return EXIT_SUCCESS;
}
holodoc je offline   Odgovor sa citatom ove poruke
Stara 21.9.2006, 1:16   #260
holodoc
Deo inventara foruma
 
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.893 puta na 1.078 poruka
Određen forumom Re: objasnjenja pocetniku

Kao što možete da vidite prethodnom kodu su dodate definicije accessora za promenljivu „starost“. U kodu se jasno vidi šta koja od ovih funkcija radi. Jednostavno, accessore treba posmatrati kao funkcije koje očitavaju i postavljaju vrednosti privatnih promenjljivih u okviru klase. Nisu neophodni jer se kompletna obrada može raditi sa promenjljivama koje su „protected“ tipa ali je veoma često potrebno promenjljive iz klase koristiti i van nje
Alternativa klasičnoj definicija klasa je tzv. „inline“ definicija accessora. Da bi demonstrirao kako bi jedna inline definicija accessora u prethodnom kodu izgledala sledi primer.
Kod:
#include<iostream>
using namespace std;
typedef unsigned short int USHORT;

class Civava { //deklarisanje klase "civava"
    // sledeci deo moze da vidi bilo koji deo programa
    public: 
        void lajanje(); 
        USHORT spavanje();
        void stajanje(USHORT broj_sapa); //ova metoda prihvata i parametre
        USHORT Starost_Ocitavanje(){return starost;} //inline definicija
        void Starost_Postavljanje(USHORT godina){starost = godina;}; //inline definicija
    // sledeci deo moze da vidi ostatak programa ali samo koriscenjem accessora klase
    private:
        USHORT starost;
        char boja_dlake[];
    // sledeci deo moze da vidi samo klasa civava
    protected:
        char falinka[];  
};

int main(){
    Civava Ubica; // ovde "pravimo" objekat "Ubica"
    Civava Serpa; // naravno ovde "pravimo" objekat "Serpa"
    
    cout << Ubica.Starost_Ocitavanje() << endl; //ispis broja godina Ubice
    Ubica.Starost_Postavljanje(77); //postavljamo novu vrednost preko accessora
    cout << Ubica.Starost_Ocitavanje() << endl; //sada ponovo ispisujemo vrednosti
    // sledeci kod cisto nostalgije radi ;)
    fflush(stdin);
    cin.get();
    return EXIT_SUCCESS;
}
Primećuje se da su odjednom nestali blokovi „Civava::Starost_Ocitavanje()“ i „Civava::Starost_Postavljanje()“ ali da su u deklaraciji metoda pridodati neki delovi tako da sada postoje dve male izmene u deklaraciji accessora i one izgledaju ovako.
Kod:
USHORT Starost_Ocitavanje(){return starost;} //inline definicija
 void Starost_Postavljanje(USHORT godina){starost = godina;}; //inline definicija
Evo o čemu se ovde radi. Svaki put kada pozovete neku funkciju u kodu program vrši određene promene u memoriji kako bi zapamtio gde treba da se vrati kada funkcija koja se poziva završi sa svojim poslom i prosledi povratnu vrednost (ako je uopšte prosleđuje). Veoma je čest slučaj da se neka funkcija poziva ogroman broj puta pa je poprilično jasno da ovakav način rada može da izazove ogromno gubljenje vremena u toku izvršavanja programa koje odlazi čisto na skokove između funkcija.
holodoc je offline   Odgovor sa citatom ove poruke
Odgovor

Bookmarks sajtovi

Tagovi
programiranje, tutoriali

Alatke vezane za temu
Vrste prikaza

Vaš status
Ne možete postavljati teme
Ne možete odgovarati na poruke
Ne možete slati priloge uz poruke
Ne možete prepravljati svoje poruke

BB kod: uključeno
Smajliji: uključeno
[IMG] kod: uključeno
HTML kod: isključeno



Sva vremena su po Griniču +2 h. Sada je 3:22.


Powered by vBulletin® verzija 3.8.7
Copyright ©2000–2024, vBulletin Solutions, Inc.
Hosted by Beograd.com