Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

Hasonló dokumentumok
Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (5. ea) C++

Programozás alapjai II. (5. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás alapjai II. (4. ea) C++

Programozás II gyakorlat. 6. Polimorfizmus

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Objektumorientált programozás C# nyelven

Felhasználó által definiált adattípus

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

osztályok kapcsolata Származtatatás C++ Izsó Tamás március 19. Izsó Tamás Származtatatás/ 1

Elemi Alkalmazások Fejlesztése II.

OOP. Alapelvek Elek Tibor

500. AA Megoldó Alfréd AA 500.

Statikus adattagok. Statikus adattag inicializálása. Speciális adattagok és tagfüggvények. Általános Informatikai Tanszék

Programozás II. 3. gyakorlat Objektum Orientáltság C++-ban

Programozás. C++ osztályok. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

C++ programozási nyelv

Bevezetés a programozásba előadás: Öröklődés

ISA szimulátor objektum-orientált modell (C++)

Programozási nyelvek Java

Programozási nyelvek Java

és az instanceof operátor

Java VIII. Az interfacei. és az instanceof operátor. Az interfészről általában. Interfészek JAVA-ban. Krizsán Zoltán

Pénzügyi algoritmusok

Visual C++ osztály készítése, adattagok, és metódusok, láthatóság, konstruktor, destruktor. Objektum létrehozása, használata, öröklés.

Java programozási nyelv 5. rész Osztályok III.

Objektumorientált programozás C# nyelven

Objektumelvű programozás

BME MOGI Gépészeti informatika 8.

Programozási nyelvek Java

Programozás alapjai II. (6. ea) C++

OOP: Java 8.Gy: Abstract osztályok, interfészek

Pelda öröklődésre: import java.io.*; import java.text.*; import java.util.*; import extra.*;

Programozás alapjai II. (6. ea) C++

Programozás módszertan p.1/46

Bevezetés a programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

Programozás alapjai II. (6. ea) C++

Számítógép és programozás 2

Bánsághi Anna 2014 Bánsághi Anna 1 of 33

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Java és web programozás

Osztályok. 4. gyakorlat

Objektumorientált paradigma és programfejlesztés Bevezető

Programozás. Bevezetés. Fodor Attila. Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (9. ea) C++ többszörös öröklés, cast, perzisztencia

Széchenyi István Egyetem. Programozás III. Varjasi Norbert

Dr. Pál László, Sapientia EMTE, Csíkszereda WEB PROGRAMOZÁS 2.ELŐADÁS. Objektumorientált programozás

Osztálytervezés és implementációs ajánlások

Osztálytervezés és implementációs ajánlások

JAVA PROGRAMOZÁS 2.ELŐADÁS

Java programozási nyelv 4. rész Osztályok II.

Programozás II gyakorlat. 7. Példák a polimorfizmus alkalmazásaira

Programozási nyelvek Java

Objektumelvű alkalmazások fejlesztése 6. gyakorlat. Öröklődés, polimorfizmus. Öröklődés Kódismétlődés objektum-orientált szerkezetben

Bevezetés a programozásba Előadás: A const

3. Osztályok II. Programozás II

Bevezetés a Programozásba II 8. előadás. Polimorfizmus Giachetta Roberto

Virtuális függvények (late binding)

Programozási technológia

Programozás. Osztályok, Származtatott osztályok. Fodor Attila

500. CC Megoldó Alfréd CC 500.

Objektumok inicializálása

Osztályok. construct () destruct() $b=new Book(); $b=null; unset ($b); book.php: <?php class Book { private $isbn; public $title;

Alkalmazott Modul III 6. előadás. Objektumorientált programozás: öröklődés és polimorfizmus

Helyes-e az alábbi kódrészlet? int i = 1; i = i * 3 + 1; int j; j = i + 1; Nem. Igen. Hányféleképpen lehet Javaban megjegyzést írni?

Programozási alapismeretek 4.

Bevezetés, a C++ osztályok. Pere László

Abstract osztályok és interface-ek. 7-dik gyakorlat

Programozás III KIINDULÁS. Különböző sportoló típusok vannak: futó, magasugró, focista, akik teljesítményét más-más módon határozzuk meg.

Öröklés és Polimorfizmus

Objektum Orientált Szoftverfejlesztés (jegyzet)

Osztály és objektum fogalma

Java VII. Polimorfizmus a Java nyelvben

Programozás alapjai II. (5. ea) C++

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a programozásba Előadás: Tagfüggvények, osztály, objektum

Programozás II gyakorlat. 4. Öröklődés

Programozás alapjai II. (8. ea) C++ többszörös öröklés, cast, perzisztencia

Programozás alapjai II. (8. ea) C++ többszörös öröklés, cast, perzisztencia

1. Öröklés Rétegelés Nyilvános öröklés - isa reláció Korlátozó öröklődés - has-a reláció

128. AA Megoldó Alfréd AA 128.

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

OOP #14 (referencia-elv)

Számítástechnika II. BMEKOKAA Előadás. Dr. Bécsi Tamás

Bevezetés a Python programozási nyelvbe

OOP és UML Áttekintés

Bevezetés a programozásba II. 8. Előadás: Osztályok, objektumok, osztályszintű metódusok

Java VII. Polimorfizmus a Java nyelvben

1.AA MEGOLDÓ BERCI AA 1.

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Objektum orientált programozás Bevezetés

Programozás BMEKOKAA146. Dr. Bécsi Tamás 7. előadás

Programozás II. 4. Dr. Iványi Péter

117. AA Megoldó Alfréd AA 117.

Absztrakció. Objektum orientált programozás Bevezetés. Általános Informatikai Tanszék Utolsó módosítás:

Átírás:

Programozás alapjai II. (5. ea) C++ Objektummodell, öröklés, virtuális tagfüggvény Szeberényi Imre, Somogyi Péter BME IIT <szebi@iit.bme.hu> M Ű E G Y E T E M 1 7 8 2 C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 1 -

OO modellezés fogalmai újból Objektum adat (állapot) és a rajta végezhető művelet a világ egy részének egy olyan modellje, amely külső üzenetekre reagálva valahogyan viselkedik (változtatja az állapotát, újabb üzenetet küld) üzenetekre (message), vagy eseményekre (event) a metódus végrehajtásával reagál, viselkedik (behaviour) polimorf működés C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 2 -

OO modellezés fogalmai újból/2 Objektum osztály, osztály (class) megegyező viselkedésű és struktúrájú objektumok mintája, gyártási forrása. (pl, ház, ablak, kutya) Objektum példány, objektum (instance) Minden objektum önállóan, létező egyed (Blöki, Morzsi, Bikfic) C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 3 -

Osztály és példány jelölése osztályok példányok Kutya (Kutya) Blöki (Kutya) Kutya név: string fajta: string kor: int (Kutya) Blöki korcs 2 (Kutya) Morzsi puli 3 C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 4 -

int i; Osztály és típus i nevű objektum aminek a mintája int Nem teljesen azonos, mert a típus egy objektum-halmaz viselkedését specifikálja. Az osztály a típus által meghatározott viselkedést implementálja. Egy adott objektumtípust többféleképpen lehet implementálni (megvalósítani). C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 5 -

Osztály és típus/2 A komplex számok viselkedését például modellezhetjük olyan osztállyal, ami valós és képzetes részt tárol, de olyannal is, ami polárkoordinátákat tárol. A kétfajta megvalósítás osztály szinten különböző, de típusuk viselkedésük interfész szinten azonos. Ennek ellenére gyakran az osztályt (pontatlanul) típusként kezeljük. Hagyományos nyelveken a típus érték-, konstansés művelethalmazt jelöl. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 6 -

Modellezés objektumokkal Különböző szempontok szerint modellezünk. Objektummodell Adat szempontjából írja le a rendszer statikus tulajdonságait (osztály vagy entitás-relációs diagram) Dinamikus modell A működés időbeliségét rögzíti (állapotgráf, kommunikációs diagram). Funkcionális modell Funkció szerint ír le (használati esetek). C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 7 -

Modellezés eszközei, módszertana Részletesen szoftvertechnológia c. tárgyban a következő félévben. Itt csak minimális alapok a nyelvi eszközök megismeréséhez, a jelölések használatához. http://www.tankonyvtar.hu/hu/tartalom/tkt/ objektum-orientalt/ch03.html C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 8 -

Objektummodell Attribútumok leírása Elnevezés típusú attribútumok. Nem vagy ritkán változnak (név, személyi szám, nem) Leíró attribútumok (jövedelem, kor) Referenciák. Kimutatnak az objektumból (cím). Kapcsolatok (relációk és linkek) leírása asszociáció, aggregáció, komponens osztályok közötti kapcsolat leírása link (lánc): példányok közötti kapcsolat Öröklés leírása C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 9 -

Példák a kapcsolatok leírására Ember név sz. idő cím gazda 0..1 * Kutya név fajta kor Egy ember 0 vagy több kutyának lehet gazdája. Egy kutyának legfeljebb egy gazdája van, de lehet, hogy gazdátlan. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 10 -

Egy több kapcsolat Anya név sz. idő cím szült 1..* Gyerek név sz. idő nem Egy anya legalább egy gyereket szült (1..*). Egy gyereket pontosan egy anya szült. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 11 -

Kapcsolatok attribútumai Hallgató név sz. idő cím vizsgázik 1..* 1..* vizsgajegy Tárgy név előadó hely Egy hallgató több tárgyból is vizsgázhat. Egy tárgyból több hallgató is vizsgázhat. A vizsga eredménye (attribútuma) a vizsgajegy. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 12 -

Komponens reláció Levél * Bekezdés * Karakter A karakter része a bekezdésnek, a bekezdés része a levélnek. Elnevezés: szülő gyerek viszony, de nem keverendő össze az örökléssel! C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 13 -

Komponens vs Aggregáció Évfolyam * Tankör * Hallgató A hallgatókat nem gyilkoljuk le, ha megszűnik a tankör. Ha az évfolyam megszűnik a tankörökre nincs szükség. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 14 -

Öröklés Az öröklés olyan implementációs és modellezési eszköz, amelyik lehetővé teszi, hogy egy osztályból olyan újabb osztályokat származtassunk, melyek rendelkeznek az eredeti osztályban már definiált tulajdonságokkal, szerkezettel és viselkedéssel. Újrafelhasználhatóság szinonimája. Nem csak bővíthető, hanem a tagfüggvények felül is definiálhatók (override) C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 15 -

Feladat Diákokból, tanárokból álló rendszert szeretnénk modellezni. Diák attribútumai: név, sz. idő, átlag, évfolyam Tanár attribútumai: név, sz. idő, tantárgy, fizetés Milyen osztályokat hozzunk létre? 2 független osztály? név, sz. idő 2x, műveletek 2x, nehezen módosítható C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 16 -

Örökléssel alaposztály specializáció az egy Diák +átlag +évf. Ember név sz. idő általánosítás az egy Tanár +tantárgy +fizetés jelölés! származtatott osztályok C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 17 -

Öröklés másként jelölve Ember név sz. idő üres, zárt fejű nyíl Diák +átlag +évf. Tanár +tantárgy +fizetés C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 18 -

Ember alaposztály class Ember { String nev; Date szuldatum; public: Ember(); void setdate(date d); void setname(char *n); const char *getname() const;... }; C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 19 -

Származtatott osztályok class Diak :public Ember { double atlag; public: Diak(); void setav(double a);... }; class Tanar :public Ember { double fizetes; public: Tanar();... }; Alaposztályból minden látszik ami publikus +Új attribútum +Új tagfüggvény C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 20 -

Öröklés előnyei Hasonlóság kiaknázása Világosabb programstruktúra Módosíthatóság mellékhatások nélkül Újabb tulajdonságok hozzáadása Kiterjeszthetőség Újrafelhasználható C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 21 -

Öröklés fajtái I. Analitikus Korlátozó II. Egyszerű Többszörös C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 22 -

Analitikus és korlátozó öröklés Alakzat poz, szin mozgat() analitikus öröklés Szakasz +végpont +rajzol() Kör +sugár +rajzol() Téglalap +csúcs +rajzol() Négyzet korlátozó öröklés C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 23 -

Kompatibilitás és öröklés A típusú objektum kompatibilis B-vel, ha A típusú objektum bárhol és bármikor alkalmazható, ahol B használata megengedett. (Liskov szubst. tétel) A reláció reflektív (A komp. A-val) és tranzitív, de nem szimmetrikus. A kompatibilitás egy hierarchiát szab meg pl: állat madár veréb C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 24 -

Kompatibilitás/2 specializáció (altípus) állat általánosítás (szupertípus) madár emlős vízi galamb veréb kutya bálna ponty C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 25 -

Alakzatok a rajztáblán Objektumok (szereplők): szakasz, kör, téglalap,... (Alakzatok) Rajztábla Alakzat műveletei: mozgat, rajzol Alakzat attribútumai: pozíció, szín Hogyan mozgat? letöröl, felrajzol Van közös attribútum? Vonal: pozíció, szín + végpont Kör: pozíció, szín + sugár C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 26 -

Geometria alakzatok C++-ban Alakzat poz, szin mozgat() analitikus öröklés Szakasz +végpont +rajzol() Kör +sugár +rajzol() Téglalap +csúcs +rajzol() Négyzet korlátozó öröklés C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 27 -

Alakzat alaposztály class Alakzat { protected: Védelem enyhítése a int x, y; leszármazottak felé int szin; public: Alakzat(int x0, int y0, int sz) :x(x0), y(y0), szin(sz) { } // mozgat(), érezzük, hogy itt a helye, de nem // tudjuk hogyan kell megvalósítani a rajzolás részét. // Ezért oda tesszük, ahol már ismert a // rajzolás menete. }; C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 28 -

Szakasz osztály class Szakasz : public Alakzat { int xv, yv; public: Szakasz(int x1, int y1, int x2, int y2, int sz) }; Alaposztályból minden látszik ami publikus : Alakzat(x1, y1, sz), xv(x2), yv(y2) { } void rajzol( ); void mozgat(int dx, int dy); Itt már tudjuk, hogyan kell rajzolni. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 29 -

Szakasz tagfüggvényei void Szakasz :: Rajzol( ) {... // szakaszt rajzol } void Szakasz :: mozgat( int dx, int dy ) { int sz = szin; // tényleges rajzolási szín elmentése szin = BACKGND;// rajzolási szín legyen a háttér színe rajzol( ); // A vonal letörlése az eredeti helyről x += dx; y += dy; // mozgatás: a pozíció változik szin = sz; // rajzolási szín a tényleges szín rajzol( ); // A vonal felrajzolása az új pozícióra } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 30 -

Téglalap osztály class Teglalap : public Alakzat { int xc, yc; public: Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { } void rajzol( ); void mozgat(int dx, int dy); }; Ugyanaz, mint a szakasznál, csak a hívott rajzol() más C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 31 -

mozgat() helye Származtatott osztályokban látszólag ugyanaz a függvény minden alakzatban csak az általa hívott rajzol() más Alaposztályban ha a hívott rajzol()-t egy manó le tudná cserélni mindig a megfelelő származtatott rajzol()-ra, akkor működne virtuális függvény C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 32 -

Alakzat osztály virtuális függvénnyel class Alakzat { protected: int x, y; int szin; public: Alakzat(int x0, int y0, int sz) }; Az öröklés során újabb jelentést kaphat, ami az alaposztályból is elérhető, így a mozgat()-ból is. :x(x0), y(y0), szin(sz) { } virtual void rajzol( ) { } void mozgat(int dx, int dy); Most már ide tehetjük, mert a rajzol() is itt van. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 33 -

Alakzat mozgat() tagfüggvénye void Alakzat :: Mozgat( int dx, int dy ) { int sz = szin; // tényleges rajzolási szín elmentése szin = BACKGRD;// rajzolási szín legyen a háttér színe rajzol( ); // A vonal letörlés az eredeti helyről x += dx; y += dy; // mozgatás: a pozíció változik szin = sz; // rajzolási szín a tényleges szín rajzol( ); // A vonal felrajzolása az új pozícióra } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 34 -

Szakasz osztály újra class Szakasz : public Alakzat { int xv, yv; public: Szakasz(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xv(x2), yv(y2) { } void rajzol( ); // átdefiniáljuk a virt. fv-t. void mozgat(int dx, int dy); }; void Szakasz::rajzol( ) {... // szakaszt rajzol. // Az alaposztályból hívva is ez hívódik } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 35 -

Téglalap osztály újra class Teglalap : public Alakzat { int xc, yc; public: Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { } void rajzol( ); // átdefiniáljuk a virt. fv-t. void mozgat(int dx, int dy); }; void Teglalap::rajzol( ) {... // téglalapot rajzol. // Az alaposztályból hívva is ez hívódik } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 36 -

Mintaprogram main ( ) { Teglalap tegla(1, 10, 2, 40, RED); // téglalap Szakasz szak(3, 6, 80, 40, BLUE); // szakasz Alakzat alak(3, 4, GREEN); //??? alak.mozgat(3, 4); // 2 db rajzol() hívás szak.rajzol( ); // 1 db rajzol() szak.mozgat(10, 10); // 2 db rajzol() hívás Alakzat *ap[10]; ap[0] = &szak; // nem kell típuskonverzió ap[1] = &tegla; // kompatibilis for (int i = 0; i < 2; i++ ) ap[i] ->rajzol(); } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 37 -

Mikor melyik rajzol()? Virtuális Alakzat:: rajzol() Nem virtuális Alakzat:: rajzol() alak.mozgat() Alakzat::rajzol() Alakzat::rajzol() szak.rajzol() Szakasz::rajzol() Szakasz:rajzol() szak.mozgat Szakasz::rajzol() Alakzat::rajzol() sp[0]->rajzol() Szakasz-ra mutat sp[1]->rajzol() Teglalap-ra mutat Szakasz::rajzol() Teglalap::rajzol() Alakzat::rajzol() Alakzat::rajzol() C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 38 -

Alakzat önállóan? Alakzat alak(3, 4, GREEN); //??? alak.mozgat(3, 4); // Mit rajzol?? Nem értelmes példányosítani, de lehet, mivel osztály. Nyelvi eszközzel tiltjuk: Absztrakt alaposztály C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 39 -

Absztrakt alaposztályok Csak az öröklési hierarchia kialakításában vesznek részt, nem példányosodnak A virtuális függvényeknek nincs értelmes törzse: tisztán (pure) virtuális függvény class Alakzat { protected: int x, y, szin; public: Alakzat( int x0, int y0, int sz) ; void mozgat( int dx, int dy ); }; Nem példányosítható virtual void rajzol( ) = 0; // tisztán virtuális virtual ~Alakzat() {}; // Ez meg mi? C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 40 -

Virtuális függvények szerepe Az alaposztály felől (alaposztály pointerét/referenciáját használva) elérhető a származtatott osztály megfelelő tagfüggvénye. Nagyon fontos szerepe van: a heterogén kollekciókban (majd később) dinamikus területet foglaló objektumok helyes megvalósíthatóságában: virtuális destruktor C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 41 -

Virtuális destruktor hiánya struct A { ~A() {}; }; A *pa = new B; class B :public A { char *p; public: B() { p=new char[10]; } ~B() { delete[] p; } }; (B) p char[10] Dinamikus memóriaterület C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 42 -

Virtuális destruktor hiánya/2 struct A { ~A() {}; }; A *pa = new B; delete pa; class B :public A { char *p; public: B() { p=new char[10]; } ~B() { delete[] p; } }; char[10] Dinamikus memóriaterület C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 43 -

Virtuális destruktor szerepe struct A { }; virtual A *pa = new B; delete pa; ~A() {}; class B :public A { char *p; public: B() { p=new char[10]; } ~B() { delete[] p; } }; A lefoglalt terület felszabadult, mert a származtatott osztály destruktora is lefutott git.ik.bme.hu/prog2/eloadas_peldak/ea_05 virt_destruktor és otthonmegmukodott C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 44 -

Most itt tartunk a feladattal C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 45 -

Öröklés impl., ha nincs virtuális fv. C++ osztályok Alakzat x, y, szín mozgat( ) Szakasz xv, yv rajzol( ) Új rész C struktúrák struct Alakzat x y szín struct Szakasz x y szín xv yv C globális függvények AlakzatMozgat( ) SzakaszRajzol( ) AlakzatKonstr( ) SzakaszKonstr( ) C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 46 -

Öröklés impl., ha a Rajzol() virtuális C++ osztályok Alakzat x, y, szín rajzol( ) Szakasz xv, yv rajzol( ) C struktúrák struct Alakzat x y szín &rajzol() struct Szakasz x y szín &rajzol() xv yv C globális függvények AlakzatRajzol( ) SzakaszRajzol( ) AlakzatKonstr( ) SzakaszKonstr( ) C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 47 -

Alakzat C implementációja struct Alakzat { int x, y, szin; void (*rajzol)( ); }; void AlakzatMozgat( struct Alakzat *this ) { } void AlakzatKonstr(struct Alakzat *this, int x0, int y0, int sz) { this->rajzol = AlakzatRajzol; // manó v. fordító? this->x = x0; this->y = y0; this->szin = sz; } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 48 -

Alakzat C implementációja/2 void AlakzatMozgat(struct Alakzat *this, int dx, int dy ) { int sz = this->szin; this->szin = BACKGND; (*(this->rajzol))(this); this->x += dx; this->y += dy; this->szin = sz; (*(this ->rajzol))(this); } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 49 -

Téglalap osztály újra class Teglalap : public Alakzat { int xc, yc; public: Teglalap(int x1, int y1, int x2, int y2, int sz) : Alakzat(x1, y1, sz), xc(x2), yc(y2) { } void ujmeret(int x2, int y2) { xc = x + x2; yc = y + y2; } void rajzol( ); // mozgat() az alaposztályban }; C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 50 -

Négyzet osztály (korlátoz) class Negyzet : private Teglalap { public: Eltakarja az alaposztályt Negyzet(int x1, int y1, int s, int sz) : Teglalap(x1, y1, x1+s, y1+s, sz) { } void rajzol( ) { Teglalap::rajzol(); } void mozgat(int dx, int dy) { Teglalap::mozgat(dx, dy); } }; Az ujmeret() fv-t így kívülről elérhetetlenné tettük (korlátoztuk az elérését) C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 51 -

Összefoglalás Objektummodell Attribútumok Kapcsolatok (relációk) Öröklés (specializáció általánosítás) analitikus v. korlátozó egyszerű v. többszörös C++ nyelvi eszköz: analitikus public, korlátozó private tagfüggvények átdefiniálása, protected mezők virtuális tagfüggvény: alaposztály felől elérhető a származtatott osztály tagfüggvénye, absztrakt alaposztály nem példányosítható C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 52 -

Elérhetőség összefoglalása attr honan külső származtatott tagfüggvény és barát public: protected: private: C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 53 -

Példa Rajzoljuk ki az alakzatokat! használjuk az SDL-t. bővítsük az objektummodellt Felrajzol pár alakzatot, melyek az egérmozgással együtt mozognak. Csak az irányt követik, nem a mozgás nagyságát. git.ik.bme.hu/prog2/eloadas_peldak/ea_05 SDL_alakzat C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 54 -

Objektummodell kibővítve C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 55 -

Előző modell kiegészítései Pont osztály bevezetése: rugalmasabb, könnyebben bővíthető (pl. 3D-re). Szin osztály: SDL-hez alkalmazkodik. Mindkettő teljesen publikus úgysem hozunk belőlük létre önálló példányt, egyszerűbb a haszn. Alakzat osztályban statikus taggal rejtjük el az SDL egyik globális adatát. (surface/sdl1, renderer/sdl2) Minden rajzolás után van frissítés > villog, de nem a felhasználói élmény a lényeg. C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 56 -

Kiegészített alakzat class Alakzat { protected: Pont p0; // alakzat origója Szin sz; // alakzat színe static SDL_Surface *scr; // eldugott globális (SDL1) public: Alakzat(const Pont& p0, const Szin& sz) :p0(p0), sz(sz) {} const Pont& getp0() const { return p0; } static void setsurface(sdl_surface* s) { scr = s; } virtual void rajzol() const = 0; // tisztán virt. void mozgat(const Pont& d); virtual ~Alakzat() {} // fontos, ha az alap. felől szabadítunk fel }; C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 57 -

Kor class Kor : public Alakzat { int r; //< sugár public: Kor(const Pont& p0, int r, Szin sz) :Alakzat(p0, sz), r(r) // Ős osztály inic {} void rajzol() const; Miért nincs }; destruktor? void Kor::rajzol() const { filledcirclecolor(scr, p0.x, p0.y, r, sz); SDL_Flip(scr); // képfrissítés } C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 58 -

A rajztábla most egy tömb alakzat *idom[100]; unsigned int db = 0; működési vázlat while (VAN ESEMÉNY) { if (GOBNYOMÁS) { if ( db < 100-1) { idom[db] = new Kor(Pont(x, y), 40, RED); // felvesz idom[db]->rajzol(); // kirajzol ++db; } } else if (EGERMOZGAS) { for (int i = 0; i < db; i++) { idom[i]->mozgat(pont(dx, dy)); idom[i]->rajzol(); // kirajzol } }} for (int i = 0; i < db; i++) delete idom[i]; // letöröl C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 59 -

git.ik.bme.hu/prog2/eloadas_peldak/ea_05 C++ programozási nyelv BME-IIT Sz.I. 2019.03.05. - 60 -