![]() |
![]() |
|
Pravljenje igara Programski jezici, tehnike, alatke u službi pravljenja igara... |
![]() |
|
Alatke vezane za temu | Vrste prikaza |
![]() |
#261 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Rešenje ovog problema je pronađeno u vidu uvođenja tzv. „inline“ definicije funkcije odnosno metode. Inline definiciju treba shvatiti veoma slično kao pretprocesorsku direktivu „#define“ koja umesto jedne reči, koliko može da zameni „#define“ u kodu, zamenjuje celu funkciju. Drugim rečima, kada pozovete neku „inline“ funkciju (ili metodu) neće dolaziti do skoka na tu pozvanu funkciju već će njen kod jednostavno biti samo kopiran na mesto gde se vrši poziv. Mućka? Ako jeste onda je u pitanju jedna jako korisna
![]() Kada je bolje definisati funkcije kao „inline“ a kada na klasičan način? U suštini „inline“ metod se koristi u slučajevima kada je metoda koja treba da se izvrši veoma kratka. U prethodnom primeru metoda „Starost_Ocitavanje()“ treba samo da vrati vrednost promenjljive „starost“ u okviru klase. Isti slučaj je i sa metodom „Starost_Postavljanje()“ koja jednino treba da njoj prosleđeni parametar „godina“ upiše u promenjljivu „starost“. U ovim primerima upotreba inline funkcija je ok. Međutim, da su metode sadržale veći broj programskih linija ili da uz to da je broj njihovih pozivanja u jedinici vremena veliki „inline“ metod ne bi bio prihvatljivo rešenje jer bi se ogromna količina resursa koristila za „prepisivanje“ sadržaja „inline“ funkcije na mestu gde se poziva. Znači, kratki obični accessori i „inline“ funkcije da, dugačke definicije „access-ora“ i „inline“ funkcije nikako! Možda se neko od vas do sada zapitao da li je prilikom kreiranja objekta na osnovu neke klase moguće tom objektu odmah na početku zadati početne vrednosti nekih ili čak svih članica promenjljivih. Na kraju krajeva u trenutku kada vas vaš komšija pita za „Šerpine“ godine „Šerpa“ već postoji tj. neće mu se dodeliti vrednost godina tek posle komšijinog pitanja. Isto važi i za vašu sposobnost da odgovorite komšiji za broj godina jer i vi odnekud morate da znate „Šerpin“ broj godina. Apsolutno isto važi i za boju dlake. Da bi ste mogli da odgovorite na to pitanje „Šerpa“ već mora da ima definisanu boju dlake. Postavljanje početnih vrednosti nekog objekta iz određene klase se vrši pomoću tzv. „konstruktora“. Konstruktori su delovi klase koji preuzimaju na sebe odgovornost da prilikom definisanje nekog objekta na osnovu njima prosleđenih podataka postave početne vrednosti objekata koji se kreiraju. U suštini, konstruktori i destruktori se uopšte ni ne moraju definisati jer će ih kompajler po sopstvenom nahođenju sam pridodati izvršnom kodu. Naravno ovakvi metodi bi bili potpuno prazni i ne bi služili ničemo. Filozofija oko toga zašto su konstruktori i destruktori must za svaku klasu je malo komplikovanija ali se svodi na to da je logično da prilikom nastajanja svakog objekta taj isti objekat ima trenutak svog nastajanja u kome se definše kakav je i šta može. |
![]() |
![]() |
![]() |
#262 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Primera radi, kada deklarišete i definišete neku promenjljivu vi ćete recimo da napišete:
Kod:
int chicken_muerto = 5; ![]() Da bi smo mogli tako nešto da uradimo iz glavnog programa potrebno je prvo definisati kontruktore. Konstruktori se definišu u okviru svake klase isto kao i bilo koji metod uz dva mala ograničenja. Naziv metoda klase mora da bude isti kao i naziv klase i ta metoda (konstruktor) ne sme da vraća vrednost. Prosleđivanje početnih vrednosti objektu se vrši njihovim navođenjem u zagradi identično kao da je u pitanju pozivanje funkcije. Primera radi, definisanje „Ubice“ iz prethodnog rpimera može da se uradi na sledeći način: Kod:
Civava Ubica(77, „zagasito crvena“); |
![]() |
![]() |
![]() |
#263 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]() Kod:
#include<iostream> #include<string> using namespace std; typedef unsigned short int USHORT; void CekajEnter(); //prototip funkcije void CekajEnter(){ cout << "\nPritisnite ENTER za izlazak iz programa..."; fflush(stdin); cin.get(); } class Civava { //deklarisanje klase "civava" public: Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase ~Civava(); //deklaracija destruktora klase // accessori za promenjljivu starost USHORT Starost_Ocitavanje() const {return starost;} // deklaracija i definicija accessora ocitavanja void Starost_Postavljanje(USHORT godina){starost = godina;} //deklaracija i definicija accessora upisa //accessori za promenjljivu boja_dlake string BDlake_Ocitavanje() const {return boja_dlake;} void BDlake_Postavljanje(string B_dlake){boja_dlake = B_dlake;} private: USHORT starost; string boja_dlake; protected: string falinka; }; //definicija konstruktora za klasu Civava Civava::Civava(USHORT argGodine, string argBoja_dlake, string argFalinka){ //postavljanje pocetne vrednosti za objekte definisane klasom Civava starost = 7 * argGodine; boja_dlake = argBoja_dlake; falinka = argFalinka; } //definicija destruktora za klasu Civava Civava::~Civava(){ } int main(){ //kreiranj objekta "Ubica" Civava Ubica(11, "zagasito crvena", "ne ume da prica"); //ispis podataka za "Ubicu" definisanih pozivom "konstruktora" cout << "***** Podaci postavljeni prilikom kreiranja objekta *****\n"; cout << "Komsijin \"Ubica\" je star tacno " << Ubica.Starost_Ocitavanje(); cout << " godina boja dlake mu je \"" << Ubica.BDlake_Ocitavanje() << "\"!\n\n" << endl; //postavljanje novih vrednosti Ubica.Starost_Postavljanje(4); Ubica.BDlake_Postavljanje("mentol plava"); // ispis podataka po ponovnom postavljanju cout << "***** Podaci postavljeni prilikom kreiranja objekta *****\n"; cout << "Komsijin \"Ubica\" je star tacno " << Ubica.Starost_Ocitavanje(); cout << " godina boja dlake mu je \"" << Ubica.BDlake_Ocitavanje() << "\"!\n" << endl; CekajEnter(); return EXIT_SUCCESS; } |
![]() |
![]() |
![]() |
#264 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Da krenemo. Na početku koda ne postoji apsolutno ništa specijalno što do sada nije ovde obrađeno. Klasično otvaranje standardnih zaglavlja, definisanje prototipa funkcije kao i same funkcije „CekajEnter“ koja treba prilikom poziva da čeka na pritisak nekog tastera od strane korisnika i to je to.
Izgled naše klase „Civava“ smo malo redizajnirali kao što smo rekli i to tako što smo izbacili sve one dodatne metode koje smo do sada imali i ostavili samo accessore. Deklaracija klase „Civava“ sada izgleda ovako: Kod:
class Civava { //deklarisanje klase "civava" public: Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase ~Civava(); //deklaracija destruktora klase // accessori za promenjljivu starost USHORT Starost_Ocitavanje() const {return starost;} // deklaracija i definicija accessora ocitavanja void Starost_Postavljanje(USHORT godina){starost = godina;} //deklaracija i definicija accessora upisa //accessori za promenjljivu boja_dlake string BDlake_Ocitavanje() const {return boja_dlake;} void BDlake_Postavljanje(string B_dlake){boja_dlake = B_dlake;} private: USHORT starost; string boja_dlake; protected: string falinka; }; Civava(USHORT argGodine, string argBoja_dlake, string argFalinka); // deklaracija konstruktora klase Kao što može da se vidi, podaci koji se prosleđuju konstruktoru kasnije u kodu su starost (argument „argGodine“), boja dlake (argument „argBoja_dlake) i falinka (argument „argFalinka“). Ovi podaci se naravno prosleđuju prilikom kreiranja objekta u kodu i to bi za objekat „Ubica“ bila konkretno sledeća linija: Kod:
Civava Ubica(11, "zagasito crvena", "ne ume da prica"); |
![]() |
![]() |
![]() |
#265 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Na trenutak bih na ovom mestu zastao i pokušao da objasnim o kakvom se tipu podataka radi u slučaju „string-a“. Naime, poznato je da C programski jezik pristupa problemu rešavanja smeštanja stringova (niza karaktera koji najčešće mogu da se posmatraju kao reči) tako što je pre toga potrebno rezervisati niz tipa „char“ određene dužine u okviru koga će u svakoj ćeliji tog niza biti smešten po jedan karakter datog stringa. Primera radi, recimo da želimo da u C programskom jeziku smestimo neki string morali bi smo to da uradimo na sledeći način:
Kod:
char Ime[15] = “Raduljko”; Ovaj pristup u suštini nije loš ali ima jednu veliku manu da je veoma lako negde u kodu napraviti grešku i „ode mas’ u propas’“. Primera radi, može se desiti da u svom kodu vršite upis u ćeliju niza van granica definicije. To se veoma lako može videti u sledećem kodu koji je u bilo kom kompajleru apsolutno sintaksički ispravan. Kod:
char Ime[10]; Ime[11] = ’X’; Kod:
char Ime[10] = “Sharevantes”; // **greska! Rezervisano samo 10 bajta a zahteva se 11. Kod:
char Ime[10] = “Raduljko”; cout << Ime[11]; // **greska! Ispis nepostojece celije. |
![]() |
![]() |
![]() |
#266 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Ovaj kod koristi isključivo stringove kao potpuno objektno-orijentisan pristup rešavanja problema. Ovakav pristup naravno ima svojih prednosti ali ima i mana. Osnovne prednosti koje bi svako po prelasku na ovakav način programiranja primetio jesu da nema više potrebe da se koristi recimo funkcija „strcpy“ za kopiranje sadržaja jednog niza karaktera u drugi (čitaj: jednog stringa u drugi). Primera radi, ako bi ste negde u kodu imali niz karaktera koji treba da sadrži neko ime jedini način da izvršite pridruživanje onoga što dati niz sadrži nekom drugom nizu jeste kopiranje iz prvog niza u drugi. Primera radi sledi kod.
Kod:
char Ime[15] = "Raduljko"; // prvi niz char Backup[15]; //drugi niz strcpy(Backup, Ime); //pridruzivanje (kopiranje) jednog niza drugom cout << Ime; // ispisuje se „Raduljko“. Kod:
string Ime; //deklaracija prvog stringa string Backup; //deklaracija drugog stringa Backup = Ime; //dodeljivanje cout << Backup; //ispis Mana ovakvog pristupa je brzina jer je prilikom zahtevnijih zadataka ponekad primetan nedostatak u pogledu brzine ovog i pristupa direktnog rada sa karakterima u nizu. Bez obzira na sve preporučuje se korišćenje string klase kad god je to moguće. Da se vratimo na naš program sa klasama. Izvršili smo deklaraciju i definiciju klase i njenih metoda i promenjljivih. No u okviru deklaracije metoda (tj. accessora) primećuje se pojava reči „const“. Kod:
USHORT Starost_Ocitavanje() const {return starost;} Sada je potrebno sve to primeniti iz glavnog programa mada je poprilično jasno šta se tu događa. Prvo se definiše objekat „Ubica“ sa određenim početnim vrednostima koje konstruktor klase „Civava“ čita i postavlja u odgovarajuće promenjljive. Kod:
Civava Ubica(11, "zagasito crvena", "ne ume da prica"); Na kraju rezime. Klase predstavljaju izuzetno moćno oružije prilikom razvoja aplikacija. Imaju svojih prednosti ali i mana. Neke od prednosti sam uspeo ovde da pomenem ali se stvarna moć klasa može osetiti u radu tek prilikom upoznavanja ostatka njihovih osobina kao što su osobine nasleđivanja, korišćenje u kombinaciji sa referencama itd. |
![]() |
![]() |
![]() |
#267 |
Kind Of A Big Deal
Član od: 1.11.2005.
Lokacija: Levo od Pakla
Poruke: 2.214
Zahvalnice: 344
Zahvaljeno 450 puta na 265 poruka
|
![]() ![]() ![]() ![]() @Marko_L ima istine i u tvojim postovima, ali ne toliko.. A jos nisam ni zaboravio nasu raspravu o pirateriji ![]() |
![]() |
![]() |
![]() |
#268 | ||
Mythbuster
|
![]() Citat:
![]() Citat:
|
||
![]() |
![]() |
![]() |
#269 |
Član
|
![]()
Svaka cast ljudi...topic je odlican (sem one zamorne rasprave na pocetku
![]() ![]() Bio sam potpuni pocetnik ali evo sada mogu cak i da napravim programic tipa : ![]() Kod:
#include <iostream> #include <cstdlib> using namespace std; int main() { cout << "Koliko ste visoki?\t" ; double visina; cin >> visina; cout << "\nJa sam visok " << visina << " m. Koliko je to milimetara?"<< endl ; cout << "To je: " << visina*1000 << " mm." << endl; system ("pause"); return 0; } Ovo sa pauzom je mozda i najkorisnija stvar koju ste postavili jer je lepo kad mozes da vidis plod svog rada (citaj:morale boost). Uzeo sam da citam (mislim da je Androssova preporuka, mrzi me da trazim :P) Accelerated C++ i za sada ide OK, ali ste mi mnogo olaksali. Necu mnogo da pisem, nekoliko poslednjih stranica sam preskocio samo da bih se zahvalio (njih cu posle da proucavam pazljivije). Sta da kazem: keep it up! ![]() There we go ![]() Poslednja ispravka: Mithrandir (29.1.2007 u 14:53) |
![]() |
![]() |
![]() |
#270 | |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]() Citat:
|
|
![]() |
![]() |
![]() |
#271 |
Starosedelac
|
![]()
On je napisao
Kod: a kod stavio u citat Zasto ne obratis paznju na dugme desno od citata... |
![]() |
![]() |
![]() |
#272 |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]()
Sad sam tek ukapirao na šta misli
![]() Kod koji ispišeš treba da selektuješ kompletan i da klikneš na ovu sliku tarabe (#) iznad editora. |
![]() |
![]() |
![]() |
#273 | |
Član
|
![]() Citat:
Ukucao sam onaj kod koji je postavio holodoc, i kako sam razumeo ne bi trebalo da mi izlazi konzola ali izlazi, pa pretpostavljam da je problem ovo sto si ti naveo ali mi nije jasno sta da uradim da mi se ne bi otvarala konzola? Kod:
#include <windows.h> int main() { MessageBox(0, "MOLIM?", "DA DA DA!!!", 0); } ![]() |
|
![]() |
![]() |
![]() |
#274 |
Starosedelac
|
![]()
Pretpostavljam da koristish VC++ 6... Skini DevC++ i nece da se pojavljuje!
|
![]() |
![]() |
![]() |
#275 | |
Deo inventara foruma
Član od: 5.12.2005.
Poruke: 6.785
Zahvalnice: 348
Zahvaljeno 1.892 puta na 1.077 poruka
|
![]() Citat:
![]() Da bi se otvorila "punokrvna" Win32 aplikacija potrebno je malo izmeniti kod ali o tome kasnije kad nađem malo vremena mada je sve u vezi ove stvarčice objašnjeno u temi "objasnjenje pocetniku" ![]() |
|
![]() |
![]() |
![]() |
#276 | |
Član
|
![]() Citat:
lol holodoc je odgovorio u isto vreme ![]() |
|
![]() |
![]() |
![]() |
#277 |
Starosedelac
|
![]()
meni se konzola u DevC++-u ne pojavljuje...
|
![]() |
![]() |
![]() |
#278 | ||
V.I.P. GNU/Linux
Član od: 1.11.2005.
Poruke: 11.269
Zahvalnice: 2.173
Zahvaljeno 5.002 puta na 2.915 poruka
|
![]() Citat:
Hvatanje entera si mogao da izvedeš i sa getchar(); Uvek gledaj da praviš maksimalno portabilne programe, naročito u ovako banalnim primerima. Citat:
Za kompajliranje preko gcc-a (koga koristi Dev-C++) postoji određeni switch da nagovestiš kompajleru da je u pitanju GUI a ne konzolni program, ali sam zaboravio kako ide... |
||
![]() |
![]() |
![]() |
#279 |
Starosedelac
|
![]()
Ali ja znam! Kad otvoris projekat, idesh na Project -> Project Options ili na kraci nacin, Alt+P, i dole desno vidis pise Type. Tu namestish Win32 GUI.
|
![]() |
![]() |
![]() |
#280 | |
Član
|
![]() Citat:
Samo, jos sam ja totalni pocetnik... ![]() |
|
![]() |
![]() |
![]() |
Bookmarks sajtovi |
Tagovi |
programiranje, tutoriali |
Alatke vezane za temu | |
Vrste prikaza | |
|
|