5. előadás

Tipp: a diák között lépkedni a J és K billentyúkkel lehet. Szöveges kereséshez ctrl-F használható.

Letöltés

1.

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 GY E T E M 1 7 82 C++ programozási nyelv © BME-IIT Sz.I. 2021.03.08. - 1-

2.

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

3.

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

4.

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

5.

Osztály és típus • int i; – 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. 2021.03.08. - 5-

6.

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

7.

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

8.

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

9.

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

10.

Példák a kapcsolatok leírására Ember név sz. idő cím 0..1 gazda 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. 2021.03.08. - 10 -

11.

Egy – több kapcsolat Gyerek Anya név sz. idő cím szült 1..* 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. 2021.03.08. - 11 -

12.

Kapcsolatok attribútumai Hallgató név sz. idő cím 1..* vizsgázik Tárgy 1..* név előadó hely vizsgajegy 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. 2021.03.08. - 12 -

13.

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

14.

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

15.

Ö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. 2021.03.08. - 15 -

16.

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

17.

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

18.

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

19.

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

20.

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

21.

Ö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. 2021.03.08. - 21 -

22.

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

23.

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

24.

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 C++ programozási nyelv © BME-IIT Sz.I. madár veréb 2021.03.08. - 24 -

25.

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

26.

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

27.

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

28.

Alakzat alaposztály class Alakzat { Védelem enyhítése a protected: leszármazottak felé int x, y; 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. 2021.03.08. - 28 -

29.

Szakasz osztály class Szakasz : public Alakzat { Alaposztályból minden int xv, yv; látszik ami publikus public: Szakasz(int x1, int y1, int x2, int y2, int sz) : 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. 2021.03.08. - 29 -

30.

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

31.

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

32.

mozgat() helye • Tegyük a származtatott osztályokba ? – látszólag ugyanaz a függvény minden alakzatban – csak az általa hívott rajzol() más • Tegyük az alaposztályba ? – 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. 2021.03.08. - 32 -

33.

Alakzat osztály virtuális függvénnyel class Alakzat { Az öröklés során újabb protected: jelentést kaphat, ami az int x, y; alaposztályból is elérhető, int szin; így a mozgat()-ból is. public: Alakzat(int x0, int y0, int sz) :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 elérhető. C++ programozási nyelv © BME-IIT Sz.I. 2021.03.08. - 33 -

34.

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

35.

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

36.

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

37.

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

38.

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

39.

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 a példányosítást: Absztrakt alaposztály C++ programozási nyelv © BME-IIT Sz.I. 2021.03.08. - 39 -

40.

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 { Nem protected: int x, y, szin; példányosítható public: Alakzat( int x0, int y0, int sz) ; void mozgat( int dx, int dy ); virtual void rajzol( ) = 0; // tisztán virtuális virtual ~Alakzat() {}; // Ez meg mi ? }; C++ programozási nyelv © BME-IIT Sz.I. 2021.03.08. - 40 -

41.

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

42.

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

43.

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

44.

Virtuális destruktor szerepe struct A { virtual ~A() {}; }; A *pa = new B; delete pa; 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 C++ programozási nyelv © BME-IIT Sz.I. virt_destruktor és otthonMegMukodott 2021.03.08. - 44 -

45.

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

46.

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

47.

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

48.

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

49.

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

50.

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

51.

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

52.

Ö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. 2021.03.08. - 52 -

53.

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

54.

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 C++ programozási nyelv © BME-IIT Sz.I. SDL_alakzat 2021.03.08. - 54 -

55.

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

56.

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

57.

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

58.

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 (SDL1) } C++ programozási nyelv © BME-IIT Sz.I. 2021.03.08. - 58 -

59.

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

60.

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

Utolsó frissítés: 2021-03-08 13.43