220 likes | 403 Views
Objektno orijentisano programiranje. Klase - nastavak. Klase. Definisanje i deklarisanje klasa Objekti klasnih tipova Metode klasa Konstruktori i destruktori Zajednički članovi klasa Prijateljske funkcije klasa. Zajednički članovi klasa.
E N D
Objektnoorijentisano programiranje Klase - nastavak
Klase • Definisanje i deklarisanje klasa • Objekti klasnih tipova • Metode klasa • Konstruktori i destruktori • Zajednički članovi klasa • Prijateljske funkcije klasa
Zajednički članovi klasa • Modifikator static na početku definicije ili deklaracije člana klase • Član je zajednički za sve objekte te klase • Članovi koji nisu zajednički nazivaju se pojedinačni • Bez eksplicitnog navođenja svi članovi klase su pojedinačni • Koriste se u slučajevima kada svi primjerci klase čine neku logičku cjelinu
Zajednički članovi - polja • Postoji samo jedan primjerak člana, bez obzira na broj objekata koji se kreiraju • Pristup polju u sastavu bilo kog objekta predstavlja pristup istoj memorijskoj lokaciji • Promjenom vrijednosti zajedničkih polja utiče se na stanje svih objekata • Zajednička polja su specijalni globalni podaci
Zajednički članovi - polja • Definisanje primjerka klase podrazumijeva definisanje svih pojedinačnih polja i dodjelu memorijskog prostora • Ovo ne važi za zajednička polja, koja se smatraju posebnim trajnim podacima sa spoljnim povezivanjem • Opis zajedničkih polja u klasi smatra se deklaracijom • Definišu se posebnim naredbama za definisanje podataka koja se pišu izvan klase • Mora se koristiti operator za razrješenje dosega
Zajednički članovi - metode • Ne posjeduju pokazivač this • Navođenjem samo identifikatora člana mogu da pristupaju samo zajedničkim članovima svoje klase • Pojedinačnim članovima mogu da pristupaju samo za konkretne objekte • Objekti mogu biti parametri zajedničkih metoda, lokalni objekti u njima ili globalni objekti
Pristup zajedničkim članovima • Pristup iz svih vrsta funkcija vrši se • navođenjem konkretnog objekta (objekat.clan ili pokazivac->clan) • bez navođenja objekta (Klasa::clan) • U metodama iste klase može da se koristi samo identifikator člana (clan) • Preporučuje se pristup Klasa::clan jer se time naglašava da se pristupa klasi u cjelini, a ne samo navedenom objektu
Prijateljske funkcije klasa • Nisu članice klase • Imaju pravo pristupa do privatnih članova klase • Mogu biti obične funkcije ili metode drugih klasa • U definiciji klase navodi se prototip ili definicija prijateljske funkcije sa modifikatorom friend • friend tip funkcija(parametri); • friend tip funkcija(parametri) blok • Nevažno je da li se funkcija proglašava prijateljskom u privatnom ili javnom dijelu • Ako se navede definicija, podrazumijeva se modifikator inline, kao za članice klase • Identifikator funkcije neće imati klasni doseg, nego doseg identifikatora cijele klase (obično datotečki doseg)
Prijateljske funkcije klasa • Prijateljska funkcija nema pokazivač thisna objekat klase kojoj je prijatelj • Prijateljstvo je relacija koja reguliše pravo pristupa, a ne oblast važenja i vidljivost identifikatora • Funkcija može da bude prijatelj većem broju klasa istovremeno • U nekim situacijama su globalne prijateljske funkcije pogodnije od funkcija članica
Prijateljske klase • Sve metode neke klase treba da budu prijateljske funkcije drugoj klasi • Pogodnije je definisanje prijateljske klase • friend identifikator_klase; • friend class identifikator_klase;
Zadaci • Klasa sa konstruktorima i destruktorom • Definicija klase tačaka u ravni • Definicija klase krugova u ravni
Klasa sa konstruktorima i destruktorom class Tekst { char* niz; // Pokazivac na sam Tekst. public: Tekst () { niz = 0; } // Inicijalizacija praznog niza. Tekst (const char*) ; // Inicijalizacija nizom znakova. Tekst (const Tekst&) ; // Inicijalizacija tipom Tekst. ~Tekst () ; // Unistavanje objekta tipa Tekst. void pisi () const; // Ispisivanje niza. } ; #include <cstring> #include <iostream> using namespace std; Tekst::Tekst (const char* t) { niz = new char [strlen(t)+1]; strcpy (niz, t); } Tekst::Tekst (const Tekst& t) { niz = new char [strlen(t.niz)+1]; strcpy (niz, t.niz); } Tekst::~Tekst () { delete [] niz; niz = 0; } void Tekst::pisi () const { cout << niz; } int main () { Tekst pozdrav ("Pozdrav svima"); // Poziva se Tekst (char*). Tekst a = pozdrav; // Poziva se Tekst (Tekst&). Tekst b; // Poziva se Tekst (). cout << "pozdrav = "; pozdrav.pisi (); cout << endl; cout << "a = "; a.pisi () ; cout << endl; } // Ovde se poziva destruktor za sva tri objekta.
Definicija klase tačaka u ravni // Definicija klase tacaka u ravni (Tacka). class Tacka { double x, y; public: void postavi (double a, double b) // Postavljanje koordinata. { x = a; y = b; } double aps () const { return x; } // Apscisa tacke. double ord () const { return y; } // Ordinata tacke. double poteg () const ; // Odstojanje od koordinatnog pocetka. double nagib () const ; // Nagib potega u odnosu na x-osu. double rastojanje (Tacka) const ; // Odstojanje od zadate tacke. Tacka najbliza (const Tacka*, int) const; // Najbliza tacka u nizu tacaka. void citaj () ; // Citaj tacku. void pisi () const; // Pisi tacku. } ;
Definicija metoda klase tačka #include <cmath> #include <iostream> using namespace std; #include "tacka1.h" // Odstojanje tekuce tacke od koordinatnog pocetka. double Tacka::poteg () const { return sqrt (x*x + y*y); } // Nagib potega u odnosu na x-osu. double Tacka::nagib () const { return (x==0 && y==0) ? 0 : atan2(y,x); } // Odstojanje tekuce tacke od tacke a. double Tacka::rastojanje (Tacka a) const { return sqrt(pow(x-a.x,2) + pow(y-a.y,2)); } // Najbliza tacka u nizu tacaka a u odnosu na tekucu tacku. Tacka Tacka::najbliza (const Tacka* a, int n) const { Tacka t = a[0]; double r, m = rastojanje (t); for (int i=1; i<n; i++) if ((r=rastojanje(a[i]))<m) {m = r; t = a[i];} return t; } // Citanje koordinata tekuce tacke s glavnog ulaza. void Tacka::citaj () { cin >> x >> y; } // Pisanje koordinata tekuce tacke na glavnom izlazu. void Tacka::pisi () const { cout << '(' << x << ',' << y << ')'; }
Definicija klase krugova u ravni #include "tacka1.h" #include <cstdlib> #include <cmath> #include <iostream> using namespace std; class Krug { Tacka c; double r; // Centar i poluprecnik kruga. struct Elem { // Element zajednicke liste svih krugova. Krug* krug; // - pokazivac na krug, Elem* sled; // - pokazivac na sledeci element liste, Elem (Krug* k, Elem* s=0);// - stvaranje elementa liste. }; static Elem* prvi; // Pocetak zajednicke liste. Krug () { r = -1; } // Stvaranje "praznog" kruga: // - SAMO za interne potrebe! Krug (const Krug&) {} // Konstruktor kopije: // - NE SME da se pravi kopija! public: Krug (double rr, double x, double y); // Stvaranje kruga; ~Krug (); // Unistavanje kruga. static bool moze (double r, double x, double y); // Moze li stati? friend double rastojanje (const Krug& k1, const Krug& k2); // Rastojanje dva kruga. bool postavi (double x, double y); // Postavljanje kruga. bool pomeri (double dx, double dy); // Pomeranje kruga. void pisi () const; // Pisanje kruga. static void pisi_sve (); // Pisanje svih krugova. };
inline double rastojanje (const Krug& k1, const Krug& k2) // Rastojanje dva kruga. { return k1.c.rastojanje (k2.c) - k1.r - k2.r; } inline void Krug::pisi () const // Pisanje kruga. { cout << "K[" << r << ','; c.pisi(); cout << ']'; } inline Krug::Elem::Elem (Krug* k, Elem* s) // Stvaranje elementa liste. { krug = k; sled = s; } Definicije ugrađenih funkcija.
Definicije metoda i zajedničkih polja klase Krug #include "krug1.h" Krug::Elem* Krug::prvi = 0; // Pocetak zajednicke liste. Krug::Krug (double rr, double x, double y) { // Stvaranje kruga. if (! moze (rr, x, y)) exit (1); r = rr; c.postavi (x, y); prvi = new Elem (this, prvi); } Krug::~Krug () { // Unistavanje kruga (izbacivanje iz liste). if (r > 0) { Elem *tek = prvi, *preth = 0; while (tek->krug != this) { preth = tek; tek = tek->sled; } (preth==0 ? prvi : preth->sled) = tek->sled; delete tek; } }
Definicije metoda i zajedničkih polja klase Krug bool Krug::moze (double r, double x, double y) { // Moze li stati? Krug k; k.r = r; k.c.postavi (x, y); for (Elem* tek = prvi; tek; tek = tek -> sled) { if (rastojanje (k,* tek->krug) < 0) { k.r = -1; return false; } } k.r = -1; return true; } bool Krug::postavi (double x, double y) { // Postavljanje kruga. if (! moze (r, x, y)) return false; c.postavi (x, y); return true; } bool Krug::pomeri (double dx, double dy) { // Pomeranje kruga. if (! moze (r, c.aps()+dx, c.ord()+dy)) return false; c.postavi (c.aps()+dx, c.ord()+dy); return true; } void Krug::pisi_sve () { // Pisanje svih krugova. cout << "\nSvi krugovi u memoriji:\n\n"; for (Elem* tek=prvi; tek; tek=tek->sled) { tek->krug->pisi(); cout << endl; } }