1 / 19

Objektno orijentisano programiranje

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.

kiana
Download Presentation

Objektno orijentisano programiranje

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Objektnoorijentisano programiranje Klase - nastavak

  2. Klase • Definisanje i deklarisanje klasa • Objekti klasnih tipova • Metode klasa • Konstruktori i destruktori • Zajednički članovi klasa • Prijateljske funkcije klasa

  3. 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

  4. 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

  5. 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

  6. 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

  7. 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

  8. 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)

  9. 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

  10. Prijateljske funkcije klasa

  11. 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;

  12. Zadaci • Klasa sa konstruktorima i destruktorom • Definicija klase tačaka u ravni • Definicija klase krugova u ravni

  13. 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.

  14. 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. } ;

  15. 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 << ')'; }

  16. 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. };

  17. 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.

  18. 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; } }

  19. 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; } }

More Related