asp objektno orijentirano programiranje

Upload: markoosijek

Post on 05-Jul-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/16/2019 ASP Objektno orijentirano programiranje

    1/46

    Uvod u objektno-orijentiranoprogramiranje u programskom

    8.4.2007 autor: dr. sc. Zvonimir Vanjak

  • 8/16/2019 ASP Objektno orijentirano programiranje

    2/46

    Evolucija programskih jezika

    prva generacija – strojni jezik

      –

    treća generacija – Pascal, C, Fortran, Algol, LISP, ... uvodi se paradigma proceduralnog, strukturnog i modularnog programiranja

    pojavljuju se i višenamjenski jezici

    objektno-orijentirani jezici kao nova paradigma razvoja (- Smalltalk, C++, Java, C#

      četvrta generacija – 4GL jezici

     jezici specijalizirani za određenu domenu problema

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 2 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    3/46

    Razvoj tipičnog programera

    uglavnom započinje učenjem nekog programskog jezika treće

    Basic, Pascal, C ,

    koristi se paradigma nestrukturiranog programiranja

      započinje se pisanjem malih i jednostavnih programa koji se sastoje odslijeda naredbi i djeluju nad zajedničkim skupom podataka

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 3 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    4/46

    Proceduralna paradigma - I

    osnovni korak je uvođenje funkcija koje su izgrađene kao skup naredbi i koje imaju dobrodefiniran ulaz i izlaz (već viđeno na PIPI-ju)

    rješavamo se problema ponavljanja programskog kôda!!!

    definiramo ga na jednom mjestu i zatim samo pozivamo funkciju kad nam zatreba takvafunkcionalnost

    Glavni program

    Podaci

    Procedura 1 Procedura 2 Procedura 3

    Lokalni podaci Lokalni podaci Lokalni podaci

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 4 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    5/46

    Proceduralna paradigma - II

    primjeri:   – , funkcije za U/I – printf, fwrite funkci e za rad s rafikom - DrawLine DrawCircle

    a što ako je netko već implementirao takve funkcije?! možemo ih ednostavno iskoristiti!

    - većina razvojnih okruženja dolazi s ugrađenom gomilom biblioteka takvih funkcija reusability – mogućnost ponovnog iskorištavanja programskog kôda

    “write once, use everywhere”

    ali, nije sve tako jednostavno  javlja se problem organizacije velikog broja funkcija u smislene cjeline!

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 5 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    6/46

    Modularno programiranje

    procedure srodne funkcionalnosti grupiraju se u module koji mogu imati vlastiteodatke

    Modul 1Program

    Procedura 1

     

    Modul 2Lokalni podaci

    Procedura 2 Procedura 3

    Podaci 1

    Lokalni podaci Lokalni podaci

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 6 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    7/46

    I dalje nije sve idealno!

    teško je napraviti modul da bude dobro definirana i zatvorena jedinicafunkcionalnosti!

    programski jezici imaju vrlo “tanku” (i često nejasnu) definiciju modula npr. u C-u modul može biti:

    - .h datoteka s pripadajućom .cpp datotekom

    - biblioteka funkcija koja se statički povezuje (linka) u naš program

     -  

    koncept modula je najčešće implementacijski detalj programskog okruženja u kojem radimoi nije potpuno integriran u sam programski jezik

    osnovni problem je što funkcije i podaci ugrađeni u modul nisu povezani u

    konkretne programske entitete koji bi predstavljali razumljiv i jasan koncept zara n e or sn e mo u a standardni predstavlja gomilu struktura i funkcija a mi bismo željeli imati “nešto”

    kao: File Binar File TextFile ...

    Algoritmi i strukture podataka, 2006/07. 8.4.2007

     

    7 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    8/46

    Potreba za objektno-orijentiranom paradigmom

    stvar nije tako kompletno crna jer ovisi i o “razini” funkcionalnostiu rađeno u modul:  moduli “niske razine” (npr. U/I funkcije u C-u, funkcije za grafičko iscrtavanje

    u Windowsima) se svakodnevno (i uspješno) iskorištavaju u projektimadiljem svijeta

    -  jasno definirani, s dobrom dokumentacijom i “izglačani” dugotrajnim korištenjem

      MASM (Microsoft Assembler) ima i varijable, i mogućnost definiranja

    zašto nam je onda uopće C zanimljiv?-  jednostavnija sintaksa, i (ipak) moćniji skup osnovnih naredbi

    traži se potpuno nova paradigma programiranja “od ovor”: ob ektno-ori entirana aradi ma

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 8 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    9/46

    Malo povijesti

    Simula (1967.) prvi programski jezik sa svojstvima objektno-orijentirane paradigme

      nam en en zgra n sus ava za s mu ac u uveden pojam klase / razreda

    Smalltalk 1972. prvi “pravi” (čisti) objektno-orijentiran programski jezik (“sve je objekt”) razvijen u laboratoriju Xerox PARC

    -

    C++ “hibridni” objektno-orijentirani jezik nastao iz C-a - ispočetka se zvao “C s razredima” (“C

    ” razvio ga je Bjarne Stroustrup (1983.) u Bell Labs

    inicijalna ANSI standardizacija je dovršena (tek) 1998., a 2003. je izdana verzija trenutno se radi na razvoju novog standarda C++0x C++ je “predak” danas široko korištenih jezika - Java, C# i VB.NET

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 9 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    10/46

    Kako ćemo “savladati” OOP?

    krećemo od (jednostavnog) problema koji ćemo riješiti u C-u

     

    koncepata OO paradigme vidjeti kako se oni mogu riješiti u C++

    problem:

    zadana je datoteka u kojoj se nalazi određeni (nepoznat) broj podataka(radi jednostavnosti, datoteka je slijedna formatirana i sadrži u svakom

    treba napisati program koji će učitati podatke iz datoteke u memoriju (u –

    omogućiti njihovu obradu- s obzirom da odaci mora u ostati u memori i nakon učitavan a ni e mo uće

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 jednostavno rješenje slijednog

    č

    itanja podataka (jedan po jedan) sve do kraja datoteke!10 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    11/46

    Jednostavno rješenje u C-u

    rješenje: 

    ih ukupno ima 

    ponovno prolazimo kroz datoteku i iznova učitavamo podatke (s time da ihsada s remamo u alocirano ol e 

    ne zadovoljava zadani uvjet!!! 

    problem

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 11 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    12/46

    Bolje rješenje

    možemo koristiti funkciju realloc  .

    potrebi povećavamo tijekom učitavanja

      “ ” pokazivač na alociranu memoriju

     

    dobro je “povezati” podatke – definiramo strukturu

    struct DinamickoPolje

    {int *Podaci;int BrojElem;

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 12 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    13/46

    Još bolje rješenje

    definiramo i određeni skup funkcija koje će raditi s tom strukturom  -

    - struct FILE (fopen, fscanf, fread , ...)

     

    int Inicijaliziraj (struct DinamickoPolje *Polje,

    int InicijalniBrojElem);void Izbrisi (struct DinamickoPolje *Polje);int PostaviNovuVelicinu struct DinamickoPol e *Pol e 

    int NoviBrojEl);

    Algoritmi i strukture podataka, 2006/07. 8.4.2007

     _ _ _ _ 

    13 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    14/46

    Što nije dobro?

    tehnički nedostaci implementacije u C-u: 

    - problem je što je ova struktura samo vrlo jednostavan “omotač” (engl. wrapper ) oko

    pokazivača („sakrili“ smo malloc i realloc od korisnika strukture, ali nismodefinirali nikakvo dodatno ponašanje)

    pristup podacima ide preko izravnog korištenja pokazivača koji je dios ru ure

    o e. o ac- nameće se primjenjivanje idioma get/set za dohvaćanje i postavljanje vrijednosti

    elemenata u ol u 

    poboljšanja:

      definiramo dodatne funkcije za rad sa strukturom

    Algoritmi i strukture podataka, 2006/07. 8.4.2007 14 / 46

  • 8/16/2019 ASP Objektno orijentirano programiranje

    15/46

    Primjer 

    struct DinamickoPolje{

    int *Podaci; 

    int MaxBrojElemenata; // koliki je maksimalno raspolozivi prostor

    };

    int Inicijaliziraj (struct DinamickoPolje *Polje,int MaxBrojElem);

    void Izbrisi (struct DinamickoPolje *Polje);

    int PostaviNovuVelicinu (struct DinamickoPolje *Polje,int NoviBrojElem);

    vo os av emen s ruc nam c o o e o e, n n ,int Vrijednost);

    int DodajElementNaKraj (struct DinamickoPolje *Polje,int Vrijednost);

    int DohvatiElement (struct DinamickoPolje *Polje, int Indeks);

    int BrojElemenata (struct DinamickoPolje *Polje);

    8.4.2007 15 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    16/46

    Tehnički problem!

    funkciju DohvatiElement() smo deklarirali kao

    int DohvatiElement struct DinamickoPol e *Pol e int Indeks

    a što ako se zatraži vrijednost elementa polja za nepostojeći indeks? 

    standardni način u C-u je signaliziranje pogreške preko povratnog argumentafunkcije novi prototip:

    int DohvatiElement2 (struct DinamickoPolje *Polje, int Indeks,*

    preko povratnog parametra (return) signaliziramo pogrešku (ako je bude) reko call b reference vraćamo dohvaćenu vri ednost

     

    alternativa: pozvati exit() pa neka programer koji koristiDinamickoPolje popravi pogrešku u svom kodu

     

    P02_DinamickoPolje_C_get_set8.4.2007 16 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    17/46

    Ozbiljan nedostatak!

    naše DinamickoPolje se može iskoristiti samo za podatketi a int! što ako imamo datoteku u kojoj su zapisani podaci tipa float?

    kako oo   ćiti našu im lementaci u strukture DinamickoPol eda se može iskoristiti za bilo koji tip podatka? klasično rješenje u C-u – korištenje typedef

    bolje (i složenije) rješenje – koristimo void * kao tip podataka u polju- programer kod iskorištavanja dinamičkog polja mora koristiti cast operatore!

    Naputak: u C++ se učinkovito i programski “čisto” rješava pomoću

    predložaka (template) .NET i Java – pojam generics  P03_DinamickoPolje_C_typedef

     

    P03_DinamickoPolje_C_void 8.4.2007 17 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    18/46

    Nedostaci sa stajališta dizajna programa

    svakoj funkciji moramo prenositi pokazivač na strukturu  “ ” 

    programeri u C-u (ali i Pascalu, Fortranu, Basicu) s takvom paradigmom“ ” -

    pozivi funkcija iz biblioteke su isprepleteni s pozivima drugih funkcija

    smanjuje se razumljivost programa

      nema zravne na prv pog e v ve povezanos e ar ranestrukture i funkcija koje nad njom operiraju sve dobivaju pokazivač struct DinamickoPolje *, ali će

    korisnici i sami definirati mnoge funkcije koje dobivaju takav pokazivač!

    8.4.2007 18 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    19/46

    Nedostaci – dio drugi

    mogućnost sukoba imena (engl. name clash) 

    koristimo hrvatske nazive za varijable i funkcije pa i nije toliki problem! -  

    omogućiti široko/internacionalno korištenje razvijene biblioteke) je situacija značajnogora (funkcije: initialize, setSize, cleanup ili delete )

    što ako netko izravno promijeni vrijednost podatka u strukturi? definirane funkcije se oslanjaju na činjenicu da samo one izravno operiraju

    nad podacima u strukturi- situacija: korisnik izravno promijeni podatak BrojElem 

     

    -   čak i ako u dokumentaciji eksplicitno piše da se to ne smije raditi, prije ili kasnije ćenetko to i napraviti (greškom, neznanjem, lijenošću – tako mu je “lakše”)

    8.4.2007 19 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    20/46

    Kako riješiti nedostatke? Jedan po jedan!

    uvodimo pojam članske funkcije!  -

    odvojeni

      ,- funkcije koje smo definirali za rad sa strukturom DinamickoPolje su “intimno”

    povezane s tom strukturom

    -

    pitanje je kako dodatno naznač

    iti tu povezanost! sintaksno – deklaraciju funkcije stavljamo unutar deklaracije

    strukture

    time funkcija postaje “član” strukture terminološka promjena

    element strukture vari abla deklarirana kao dio strukture osta e članska

    varijabla strukture8.4.2007 20 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    21/46

    Jednostavan primjer 

    struct StrukturaC { struct StrukturaCPP {

    };

    void Funkcija(StrukturaC *s){ void Funkcija() { };

    { StrukturaC objC;Funkcija (&objC);

    StrukturaCPP objCPP;objCPP.Funkcija();

    return 0;}

     

    P04_PrimjerClanskeFunkcije8.4.2007 21 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    22/46

    Što smo postigli?

    riješili smo “problem” stalnog prenošenja pokazivača na strukturu kaoarametra “problem” je samo prividno riješen – sada se mora naznačiti za koju varijablu (instancu

    strukture) se poziva funkcija riješili smo problem sukoba imena

    možemo imati funkcije istog imena, sve dok su one elementi različitih struktura

      poz v un c a o e su o s ru ure se s n a sno asno raz u u o poz va“običnih” funkcija

     instanca_strukture.ime_funkcije(parametri)

    funkci e ko e izravno d elu u nad odacima u strukturi ima u izravnu vezu skonceptom strukture  jasno, jer su njen integralni dio

    8.4.2007 22 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    23/46

    A kamo je nestalo DinamickoPolje *?

    odnosno, kako pozvana funkcija “zna” za koju je varijablu strukture pozvana? funkci i se im licitno renosi okazivač this

    this  je pokazivač koji pokazuje na varijablu strukture za koju je članska funkcijapozvana“ ” “ ”

    Primjer:

    int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem) {// implicitno korištenje thisBrojElem = 0;

    // ili eksplicitno

    this->_BrojElem = 0;...}

     

    P04_DinamickoPolje_Cpp1_clanske_funkcije8.4.2007 23 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    24/46

    Operator određivanja dosega (scope resolution)

    pojavile su se neke dvotočke u prethodnom primjeru?

     

    int DinamickoPolje::Inicijaliziraj(int inMaxBrojElem)...

    ::  

    u C++: doseg (scope) = “mjera” vidljivosti identifikatora (varijable,

    funkcije, klase) u programu u našem primjeru je bitan jer njime kod implementacije funkcijeInicijaliziraj (a i svake druge članske funkcije)

    naznačavamo njenu pripadnost razredu DinamickoPolje!

    8.4.2007 24 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    25/46

    Što je ostalo?

    i dalje imamo problem – moguće je izravno promijeniti sadržaj varijabli ustrukturi utječemo na kasnije ponašanje članskih funkcija (najčešće s nedefiniranim posljedicama!)

    rješava se uvođ

    enjem prava pristupa pr va e   pu c  dio će biti dostupan svima, a koji dio će biti dostupan samo članskim funkcijama strukture

    sintaksa:

    struct PrimjerStrukture {

    int _JavnoDostupnaVarijabla;void JavnoDostupnaClanskaFunkcija(int Parametar);

    rivate:int _PrivatnaVarijabla;float PrivatnaClanskaFunkcija();

    };

    8.4.2007 25 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    26/46

    Pristup privatnim dijelovima strukture

    što se misli pod “dostupan”?  

    pristupiti privatnim dijelovima strukture

     

    var._PrivatnaVarijabla = 0;

    -  

    privatnim dijelovima strukture se može pristupiti samo unutar

    i članske funkcije mogu biti privatne!

      P05 Prim erStrukturePravaPristu a postoji i protected pravo pristupa  

     _ 

     

    8.4.2007 26 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    27/46

    Konačno – razredi (klase)!

    uvodimo ključnu riječ class  -

    koja je razlika?  sa s anov a ++ prevo e a pr marno s n a sna – o s ru ure e svepodrazumijevano public dok je kod razreda sve podrazumijevano

    konceptualna razlika:-  

    ostali dijelovi programa direktno operiraju

    -

    razred kao primarni koncept OO paradigme (prisutan u svim OO jezicima!) namijenjene mo e ran u pre s av an u oncepa a z po ru a pro ema o r e avamo(DinamickoPolje, Stog, HashFile, ...) koji imaju složeno ponašanjerealizirano preko skupa članskih funkcija

     

    P05_DinamickoPolje_Cpp2_prava_pristupa8.4.2007 27 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    28/46

    Malo teorije

    dva osnovna elementa OO paradigme: apstrakcija i enkapsulacija

     –problema koji rješavamo

      razre nam c o o e e aps ra c a oncep a nam og po a sdobro definiranim karakteristikama

      -- struktura predstavlja agregatni skup podataka nad kojima operiraju “vanjski” elementi

    programa (funkcije)

    - vanjske funkcije nisu dio strukture – zbog toga struktura nije “potpuna” jer je zarazumijevanje koncepta koji predstavlja potrebno proučiti nešto što nije dio same

    - struktura nije “zatvorena” u smislu da ne upravlja sama svojim ponašanjem i stanjem!

     

    8.4.2007 28 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    29/46

    Enkapsulacija

    niti jedan dio sustava ne bi smio ovisiti o unutrašnjim detaljima

    korisnika razreda DinamickoPolje ne bi trebalo zanimati kako je

    - napomena: koncept dinamičkog polja je vrlo jednostavan i praktički implicira načinimplementacije (dinamička alokacija memorije za elemente polja), ali kod složenijihrazreda to ni u kojem slu aju nije tako!   čak i kod dinamičkog polja možemo imati varijabilnost u implementaciji

    npr., ako je rukovanje memorijom “skriveno” od korisnika razreda, može se izgraditivlastiti memory-manager (ne koristimo malloc i realloc, već vlastitu

    implementaciju – npr. radi efikasnosti)

    ostižemo deklariran em unutrašn ih detal a razreda kao rivate budući da tada ionako ne može pristupiti tim dijelovima, korisnik razredaDinamickoPol e ne može o n ima ni ovisiti zato er ih ne može

    izravno referencirati u programskom kodu koji on piše)8.4.2007 29 / 46Algoritmi i strukture podataka, 2006/07.

  • 8/16/2019 ASP Objektno orijentirano programiranje

    30/46

    Javno sučelje razreda

    sve što je u razredu deklarirano kao public dio je javnog sučelja  “ ”

    komunicira s ostalim dijelovima programa  e n ran em ans var a ao pr va e, razre s r va svo e s an e

    primjer enkapsulacije u stvarnom životu:

    DVD player – javno suč

    elječ

    ini par kabela i daljinski upravljač

    - “običnog” korisnika u biti ne zanima kako DVD player radi sve dok on ispravno reagira“ ” , , , ...

    slično vrijedi i za razrede za or sn a razre a nam c o o e no e a razre ma

    očekivano ponašanje, a kako je unutar razreda omogućeno takvo,

    8.4.2007 30 / 46Algoritmi i strukture podataka, 2006/07.

    P j bj kt

  • 8/16/2019 ASP Objektno orijentirano programiranje

    31/46

    Pojam objekta

    ovo je deklaracija razreda (novi tip podatka):

     ...

    };

    slično kao i kod struktura, razred predstavlja predložak iz kojega će se kreiratiob ekti!

    kod struktura koristimo termin varijabla strukture ili instanca strukture kod razreda se konkretna instanca naziva objektom

      razre e e an, a z n ega se mo e ns anc ra pro zvo an ro o e a a- svi će biti “isti” u smislu da svi imaju isti skup članskih varijabli i članskih funkcija-

    objekti se razlikuju po vrijednostima koje imaju njihoveč

    lanske varijable (te vrijednostipredstavljaju stanje objekta)- analogija sa strukturom polje – svi članovi su istog tipa, a vrijednosti im se razlikuju za svaki

    indeks polja

    8.4.2007 31 / 46Algoritmi i strukture podataka, 2006/07.

    K i j bj k t

  • 8/16/2019 ASP Objektno orijentirano programiranje

    32/46

    Kreiranje objekata

    slično kao i kod struktura, kreiranje objekta primarno podrazumijeva

    odnosno, treba alocirati prostor za članske varijable razreda

      mogu a su va s an ar na na na: smještanje objekta na stog

    - o e se e ar ra ao o a n o e unu ar un c e

    smještanje objekta na gomilu (heap)“ ”-  eksplicitno mora “uništiti” (izbrisati iz memorije)

      , new – operator za kreiranje objekata na heapu

     –

    8.4.2007 32 / 46Algoritmi i strukture podataka, 2006/07.

    Primjer za i d l t

  • 8/16/2019 ASP Objektno orijentirano programiranje

    33/46

    Primjer za new i delete

    class MojRazred

     public:int _MojPodatak;

    };

    int main(int argc, char* argv[]) { MojRazred objStog; // objekt na stogu

    =._

     MojRazred *pStog = new MojRazred(); // objekt na heap u pStog->_MojPodatak = 10;

    delete pStog; // moramo eksplicitno osloboditi memoriju

     // po završetku funkcije, objStog će se automatski// ukloniti iz memorije

    }

    8.4.2007 33 / 46Algoritmi i strukture podataka, 2006/07.

    B i j lj

  • 8/16/2019 ASP Objektno orijentirano programiranje

    34/46

    Brisanje polja

    new i delete nisu namijenjeni isključivo za kreiranje i uništavanje objekata: predstavljaju općenitu zamjenu za malloc i realloc type safe verzija – točno se zna za kakav tip podatka se alocira memorija

    primjeri:float *pFloat = new float;int *pInt = new int[10];char * Strin = new char 20

    delete pFloat;delete [] pInt;

    za brisanje polja mora se koristiti operator delete []

    delete [] pString;

      P06_Primjer_new_delete

    8.4.2007 34 / 46Algoritmi i strukture podataka, 2006/07.

    Inicijalizacija objekta

  • 8/16/2019 ASP Objektno orijentirano programiranje

    35/46

    Inicijalizacija objekta

    kreiranje objekta ipak ne znači samo alokaciju memorije za smještanje objekta bitno e u kakvom stan u se ob ekt nalazi nakon kreiran a odnosno kakve su mu vri ednosti

    članskih varijabli

    problem inicijalizacije  javlja se i u C-u:

    nakon deklaracije int a; nije jednoznačno definirano kakvu vrijednost ima varijabla a

      o o e a a e s var ma o s o en a er v ero a no ma u v e ans var a kako inicijalizirati pokazivače koji su dio razreda?

      “ ”funkcija Inicijaliziraj() koja dovodi kreirani objekt u ispravno stanje

    a što ako kreiramo ob ekt i zaboravimo ozvatiInici alizira ? pogreška pri korištenju objekta!

    8.4.2007 35 / 46Algoritmi i strukture podataka, 2006/07.

    Pojam konstruktora objekta/razreda

  • 8/16/2019 ASP Objektno orijentirano programiranje

    36/46

    Pojam konstruktora objekta/razreda

    uvodimo pojam konstruktora objekta posebna članska funkcija namijenjena inicijalizaciji stanja objekta kod njegovog kreiranja prepoznaje se po imenu funkcije – mora biti isto kao i ime razreda

    sintaksa:  public: MojaKlasa() { ... } // konstruktor bez parametara

    Prim er reo terećena overloadin a  funkci e

      ...

    };

    imamo funkcije istog imena (u C-u nije dozvoljeno) a prevodilac ih razlikuje po parametrima

    konstruktor nema povratnog parametra – ne vraća i ne može vratiti nikakavpo a a na on zvr avan a a ako dođe do pogreške koju treba signalizirati ostatku programa – treba “baciti” izuzetak

    (engl. exception)

    8.4.2007 36 / 46Algoritmi i strukture podataka, 2006/07.

    Podrazumijevani konstruktor

  • 8/16/2019 ASP Objektno orijentirano programiranje

    37/46

    Podrazumijevani konstruktor 

    Primjer korištenja: 

     MojaKlasa a;

     MojaKlasa b(10);o a asa c = new o a asa ; MojaKlasa *d = new MojaKlasa(10);}

    a kako su onda radili naši prethodni primjeri (bez definiranog

    prevodilac za svaki razred za koji nije eksplicitno definiran

    . konstruktor bez parametara koji članske varijable inicijalizira na neke

    8.4.2007 37 / 46Algoritmi i strukture podataka, 2006/07.

    Destruktori

  • 8/16/2019 ASP Objektno orijentirano programiranje

    38/46

    Destruktori

    definiranjem konstruktora smo “pokrili” kreiranje objekta, a što je s

    možemo definirati destruktor razreda  ans a un c a o a e se poz va pr om un avan a o e a

    “uništavanje” objekta = brisanje objekta iz memorije

    tehnič

    kim žargonom – objekt izlazi iz dosega (engl. goes out of scope) za objekte kreirane na stogu – trenutak kada funkcija u kojoj su deklarirani

    završava i briše sve svoje podatke sa stoga za objekte kreirane na heapu – trenutak kad se nad njima poziva delete

    ako je u razredu definiran destruktor, prevodilac će ga automatskipozvati u trenutku uništavanja objekta

    8.4.2007 38 / 46Algoritmi i strukture podataka, 2006/07.

    Primjer sintakse

  • 8/16/2019 ASP Objektno orijentirano programiranje

    39/46

    Primjer sintakse

    class MojaKlasa {

     MojaKlasa() { ... } // konstruktor 1

     MojaKlasa(int a) { ... } // konstruktor 2~MojaKlasa() { ... } destruktor (jedan!)

    };

    void main() { MojaKlasa a; Mo aKlasa *b = new Mo aKlasa();... // tijelo funkcijedelete b; // poziva se destruktor za b(eksplicitno)

     // poziva destruktor za a

      P06_PrimjerKonstruktorDestruktor

    8.4.2007 39 / 46Algoritmi i strukture podataka, 2006/07.

    Curenje memorije

  • 8/16/2019 ASP Objektno orijentirano programiranje

    40/46

    Curenje memorije

    isto pitanje – kako su radili naši prijašnji primjeri u kojima nije bilo destruktora? uništavanje objekta je podrazumijevalo samo oslobađanje memorije (alocirane za smještaj

    samog objekta) i to za to se pobrinuo prevodilac destruktor je “glumila” funkcijaIzbrisi() koja je oslobađala zauzetu memoriju

      Imamo curenje memorije (memory leak) u programu – zauzeli smo resurse računala ali ih

    nismo oslobodili iako ih više ne koristimo  za oravnos programera u a v m s u a ev ma mo e vo zraz o nezgo n m

    pogreškama rednost destruktora – revodilac će se obrinuti da se ozove funkci a za

    uništavanje objekta nakon što definiramo destruktor, sigurni smo

    -new) mora se pozvati delete!

    - kreator objekta određuje kada će se on uništiti

      P06_DinamickoPolje_Cpp3_konstruktori

    8.4.2007 40 / 46Algoritmi i strukture podataka, 2006/07.

    Kopiranje objekata

  • 8/16/2019 ASP Objektno orijentirano programiranje

    41/46

    Kopiranje objekata

    što je s kopiranjem objekata? .

    za obične tipove (int, float, char) je to jednostavno – u funkciji se

    kreira lokalna vari abla isto ti a i automatski inici alizira s renesenomvrijednošću

    a što ako se prenosi objekt?

    void NekaFunkcija(MojaKlasa obj) {...

    }void main() { MojaKlasa a;

     NekaFunkcija(a);}

    8.4.2007 41 / 46Algoritmi i strukture podataka, 2006/07.

    Sintaksa copy-constructora

  • 8/16/2019 ASP Objektno orijentirano programiranje

    42/46

    Sintaksa copy constructora

    osnovno pitanje – pomoću kojeg konstruktora se kreira lokalni objekt objprilikom poziva funkcije NekaFunkcija()?

    poziva se tzv. copy-constructor a gdje je on u našem razredu? – nema ga eksplicitno, ali je prevodilac sam definirao

    “ ”

    Sintaksa:class Mo aKlasa public: MojaKlasa() { ... } // konstruktor 1 MojaKlasa(int a) { ... } // konstruktor 2 Mo aK asa const Mo aK asa & n tO ... copy-constructor~MojaKlasa() {} // destruktor

    };

    copy-constructor se prepoznaje po svom parametru – prima referencu naobjekt istog tipa koji će poslužiti kao osnova za kreiranje novog objekta

     =

    8.4.2007 42 / 46Algoritmi i strukture podataka, 2006/07.

    Problem s copy-constructorom

  • 8/16/2019 ASP Objektno orijentirano programiranje

    43/46

    Problem s copy constructorom

    podrazumijevana implementacija copy-constructora radi samo

    novostvorenog objekta

      objekti koji u sebi nemaju pokazivače na alocirane resurse (memorija,

    , , ...

    neispravan za naš razred DinamickoPolje objekt kreiran pomoću podrazumijevanog copy-construktora će pokazivati

    na istu memoriju alociranu za polje

      nam c o o e  - NE! – od početka se radi o call by value!

    -   ,pokazivač na objekt

    8.4.2007 43 / 46Algoritmi i strukture podataka, 2006/07.

    Dva načina kopiranja objekata

  • 8/16/2019 ASP Objektno orijentirano programiranje

    44/46

    Dva načina kopiranja objekata

    postoje dva načina kopiranja objekata   – -  

    novu kopiju objekta- za razred DinamickoPol e to znači alociran e nove memori e i inici alizaci u

    elemenata u tom polju s vrijednostima iz objekta predanog copy-constructoru

    shallow copy – kreira se novi objekt, ali on nastavlja “dijeliti” određeni diostanja s objektom na temelju kojega je nastao

    - za DinamickoPolje to znači da nakon kreiranja objekta pomoću copy- 

    - doći će do problema kad se pozovu destruktori za ta dva objekta prvi poziv destruktora će proći u redu, ali kad se pozove destruktor za drugi objekt,

    po u a os o a an a ve os o o ene memor e e uzro ova pogre u

      P07_DinamickoPolje_Cpp4_copy_constructor

    8.4.2007 44 / 46Algoritmi i strukture podataka, 2006/07.

    Reference

  • 8/16/2019 ASP Objektno orijentirano programiranje

    45/46

    Reference

    referenca = pokazivač s malo drugačijom sintaksom 

    prevodilac to obavlja automatski

      e arac a re erence se prepozna e po pre su &

    Primjer:   P07_PrimjerReference

    void main() {int a = 5;

    int *pa = &a; // pokazivač pa pokazuje na varijablu aint &ra = a; // referenca ra takođ er referencira varijablu a

    *pa = 10; // varijabla a sada je jednaka 10

    ra = 15; // a e sada ednako 15}

    8.4.2007 45 / 46Algoritmi i strukture podataka, 2006/07.

    Primjeri:

  • 8/16/2019 ASP Objektno orijentirano programiranje

    46/46

    j

    razred Trokut: 

    geometrijskog lika koji ima definiranu duljinu svake od tri stranice i

    u rađenu funkcionalnost za izračunavan e ovršine i o se a trokuta

     P08_Trokut

      izgraditi razred KompleksniBroj koji će predstavljati (matematički)

    .predstavljati realni i imaginarni dio i pružati funkcionalnost za obavljanjematematičkih operacija s kompleksnim brojevima (zbrajanje, oduzimanje,množenje i dijeljenje)

      P09 Kom leksniBro _ 

    8.4.2007 46 / 46Algoritmi i strukture podataka, 2006/07.