zvonimir bujanovi vinko petrievi - unizg.hr · 2008. 5. 13. · lanovi cetverokuta neka budu...

25
Zvonimir Bujanovi Vinko Petri evi

Upload: others

Post on 18-Feb-2021

0 views

Category:

Documents


0 download

TRANSCRIPT

  • Zvonimir BujanoviVinko Petri evi

  • enkapsulacija korisnik strukture vidi i mo e koristiti samo one podatke koji mu zaista i trebaju za rad sa strukturomnaslje ivanje specijalizirane strukture mogu dijeliti zajedni ku funkcionalnost sa op enitijim strukturamapolimorfizam srodni objekti sa zajedni kim su eljem se mogu pona ati na razli ite na ine

  • treba li korisnik stoga pristup do varijabli podaci i vrh?struct stack {

    int podaci[100], vrh;

    int top() { ... }void push( int x ) { ... }void pop() { ... }stack() { ... }

    };

  • Rje enje: podaci i vrh su privatni, ostali elementi klase su javniclass stack {private:

    int podaci[100], vrh;

    public:int top() { ... }void push( int x ) { ... }void pop() { ... }stack() { ... }

    };

  • sada podaci i vrh smiju koristiti samo funkcije lanice!int stack::top() {

    return podaci[vrh]; // OK}

    int main( void ) {stack S; int a;...

    a = S.top(); // OKa = S.podaci[S.vrh] // krivo!

    }

  • i unutar struct-a mo emo definirati vrstu pristupa (private ili public) na isti na instruct defaultna vrsta pristupa je publicclass defaultna vrsta pristupa je privatefunkcije lanice tako er mogu biti bilo private bilo public

  • promotrimo ovakvu klasu:class Instrument {public:

    string raspon;int starost;

    Instrument() { raspon=""; starost=0; }

    Instrument( string r, int s ){ raspon = r; starost = s; }

    void sviraj( string ton ){ cout

  • elimo uvesti novi tipove podatka ZicaniInstument i Glasoba ova tipa imaju tako er raspon i starostZicaniInstrument ima jo podatak o broju ica, a Glas o vrsti (alt, bariton i sl.)

    vrijedi: ZicaniInstrument je podvrstaInstrumenta, Glas je podvrsta Instrumenta

  • jedno mogu e (lo e!) rje enje (crveno je onoto se preklapa sa Instrument-om):

    class Glas {public:

    string raspon, tipGlasa;int starost;

    Glas( string ras, int star, string tip ){ raspon = ras; starost = star;

    tipGlasa = tip; }

    void sviraj( string ton ){ cout

  • rje enje:

    ovdje Glas automatski dobiva sve lanove (i podatke i funkcije) koje je imao Instrument

    class Glas : public Instrument {public:

    string tipGlasa;

    Glas( string ras, int star, string tip ){ raspon = ras; starost = star;

    tipGlasa = tip; }};

  • osim toga, samo kod drugog rje enja svaki Glaszaista i je Instrument, tj. mo e se raditi ovo:

    Instrument i( "A1-C5", 10 );Glas Jacques( "C4-C6", 25, "tenor" );

    i = Jacques; // OK, Jacques je Glas, a svaki// Glas je Instrument

    Jacques = i; // krivo! Nije svaki Instrument // ujedno i Glas (koji mu je tipGlasa???)

    Jacques.sviraj( "F5" ); // OK

  • Instrument je tzv. bazna klasa, a Glas izvedena klasaako je lan (podatak, funkcija) u Instrument bio public, onda je on public i u Glas i dostupan je i funkcijama lanicama u Glas i korisnicima objekta tipa Glasako je lan (podatak, funkcija) u Instrument bio private, onda on nije dostupan lanicama u Glasako je lan (podatak, funkcija) u Instrument bio protected, onda je on dostupan funkcijama u Instrument i Glas, ali nije dostupan nikome izvan. On ostaje protected i u Glas.

  • kod deklaracije:

    prvo se poziva (defaultni, zasad) konstruktor za baznuklasu, tj. za Instrumentzatim se poziva konstruktor za Glas sa odgovaraju im parametrima

    Glas Jacques( "C4-C6", 25, "tenor" );

    class Glas : public Instrument {public:

    string tipGlasa;

    Glas( string ras, int star, string tip ){ raspon = ras; starost = star;

    tipGlasa = tip; }};

  • ali, dio koda u konstruktoru za Glas se posve podudara sakodom u konstruktoru za Instrumentzato emo kod Glas-a definirati da se prvo treba pozvati odgovaraju i konstruktor za Instrument:

    uo i: sada mo emo sve podatke u Instrument i Glas postaviti na private (do sada su mogli biti i protected)

    class Glas : public Instrument {public:

    string tipGlasa;

    Glas( string ras, int star, string tip ) :Instrument( ras, star ){ tipGlasa = tip; }

    };

  • Napravite hijerarhiju klasa: cetverokut, pravokutnik, kvadrat

    lanovi cetverokuta neka budu duljine svih stranica i funkcija za ra unanje opsegaNeka svaka klasa ima konstruktor pomo u kojeg se mo e zadati duljina stranica lika; neka jo svaki konstruktor ispisuje poruku o kojem je liku rijeneka svaka klasa ima destruktor koji ispisuje o kojem je liku rijeneka main u itava duljinu stranice kvadrata i ispisuje njegov opseg

  • Glas se zna pona ati kao Instrument u svakoj situaciji:void ugodiInstrument( Instrument &i ){ i.sviraj( "C4" ); }

    Glas Jacques( "C4-C6", 25, "tenor" );Instrument i = Jacques; // OKInstrument &r = Jacques; // OKInstrument *p = &Jacques; // OK

    ugodiInstrument( Jacques ); // OK

  • primijetimo da za Glas mo emo imati specijaliziranu funkciju sviraj:class Glas { ...

    void sviraj( string ton ){ cout

  • me utim...Glas Jacques( "C4-C6", 25, "tenor" );Instrument i = Jacques;

    // ispis: "Instrument svira ton C5"i.sviraj( "C5" );

    // ispis: "Instrument svira ton C4"ugodiInstrument( Jacques );

  • rje enje: u Instrument treba funkciju ozna iti kao virtualnutako se obznanjuje da e naslje ene klase eventualno imati svoju verziju. Takve klase se zovu polimorfne.class Instrument { ...

    virtual void sviraj( string ton ){ cout

  • ovo radi samo za reference i pointere!!!

    class Instrument { ...virtual void sviraj( string ton ){ cout

  • nadopunite hijerarhiju iz Zadatka 1 klasamaparalelogram (koja ima dodatni lan kut) i romb; nemojte stavljati da je pravokutnik vrstaparalelogramanadopunite sve klase funkcijom povrsina (zaetverokut neka vra a -1)

    napravite polje koje se sastoji od 10 raznovrsnih etverokuta i ispisuje povr ine svakog od njih

    uo i: polje se mora sastojati od pointera na dinami ki alocirane (sa new!) objekte ( to ako nisu pointeri unutra? Probajte.)

  • uo imo da zapravo nikada ne emo deklarirati objekt klase Instrument mo emo imati objekt tipa Glas, Gitara, Flauta i sli no, ali Instrument je apstraktan, preop enit pojamkod takvih baznih klasa redovito postoje funkcije za koje znamo da ih svaka izvedena klasa mora imati ali su preop enite kod bazne klasenpr. svaki Instrument mo e se svirati ali je recimo opis tog sviranja preop enit (dok npr. Glas pjeva, a Flauta piskuta, i sl.)

  • takve funkcije u baznoj klasi zovemo iste (pure) virtualne funkcije, a klase koje imaju barem jednu istu virtualnufunkciju apstraktnim:

    iste virtualne funkcije nikad nemaju implementacijune mo e se napraviti objekt apstraktne klase:

    class Instrument { ...virtual void sviraj() = 0;

    };

    Instrument i( "C1-A3", 3 ); // krivo!

    Glas Jacques( "C4-C6", 25, "tenor" );Instrument &r = Jacques; // OK

  • ako izvedena funkcija ne napraviimplementaciju iste virtualne funkcije, onda je i ona apstraktna!npr. ZicaniInstrument bi isto mogla biti apstraktna klasa (ako ne implementiramo sviraj u njoj ve u izvedenim klasama Gitara i Violina)

  • u hijerarhiju iz Zadatka 2 dodajte klase Trokuti Krugdodajte i polaznu baznu klasu Lik iz koje su izvedene sve ostale; npr. bazna klasa mo e imati podatak o broju stranica (-1 za krug)izmijenite glavni program iz Zadatka 2 tako da ima vektor raznih likova kojima ra una povr inu; omogu ite korisniku da odabere broj i vrstu likove, te njihove parametre