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

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

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

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

Bevezetés a programozásba Előadás: Fordítási egység

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

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

Programozás II gyakorlat. 6. Polimorfizmus

é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

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

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.

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

Osztályok. 4. gyakorlat

C++ programozási nyelv Konstruktorok-destruktorok

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

OOP #14 (referencia-elv)

Programozás II gyakorlat. 8. Operátor túlterhelés

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

Pénzügyi algoritmusok

3. Osztályok II. Programozás II

C++ programozási nyelv

5. Gyakorlat. struct diak {

1. Mi a fejállományok szerepe C és C++ nyelvben és hogyan használjuk őket? 2. Milyen alapvető változókat használhatunk a C és C++ nyelvben?

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

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

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

C++ programozási nyelv Struktúrák a C++ nyelvben

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

Objektumorientált programozás C# nyelven

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

Programozási nyelvek Java

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

Bevezetés a programozásba. 11. Előadás: Esettanulmány

Osztály és objektum fogalma

Programozás C és C++ -ban

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

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

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

Bevezetés a Python programozási nyelvbe

Bevezetés a programozásba. 9. Előadás: Rekordok

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

Programozási nyelvek Java

Objektumok inicializálása

Programozás I gyakorlat

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

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

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

Objektumorientált szoftverfejlesztés alapjai

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

Objektumelvű programozás

500. CC Megoldó Alfréd CC 500.

Miután létrehoztuk, szeretnénk neki beszédesebb nevet adni. A név változtatásához a következőt kell tenni:

1. Alapok. Programozás II

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

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

Pénzügyi algoritmusok

OAF Gregorics Tibor: Minta dokumentáció a 3. házi feladathoz 1.

Programozás C++ -ban

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Már megismert fogalmak áttekintése

C++ programozási nyelv

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

JAVA PROGRAMOZÁS 2.ELŐADÁS

500. AA Megoldó Alfréd AA 500.

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

Kivételkezelés, beágyazott osztályok. Nyolcadik gyakorlat

Smart Pointer koncepciója

Java VI. Miskolci Egyetem Általános Informatikai Tanszék. Utolsó módosítás: Ficsor Lajos. Java VI.: Öröklődés JAVA6 / 1

Elemi Alkalmazások Fejlesztése II.

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

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

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

7. fejezet: Mutatók és tömbök

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

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Programozás C++ -ban

Osztálytervezés és C++ implementációs ajánlások I.

Interfészek. PPT 2007/2008 tavasz.

Google C++ style guide

Öröklés és Polimorfizmus

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

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

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ó

feladat pont min elért

Bevezetés a Programozásba II 11. előadás. Adatszerkezetek megvalósítása. Adatszerkezetek megvalósítása Adatszerkezetek

Programozási nyelvek Java

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

Programozás módszertan p.1/46

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

Globális operátor overloading

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós március 3. Széchenyi István Egyetem, Gy r

C# Nyelvi Elemei. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) C# Nyelvi Elemei / 18

A lista eleme. mutató rész. adat rész. Listaelem létrehozása. Node Deklarálás. Létrehozás. Az elemet nekünk kell bef zni a listába

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

128. AA Megoldó Alfréd AA 128.

3. Gyakorlat Ismerkedés a Java nyelvvel

#include <iostream> using namespace std; // struct macska is lehetne class macska { public: int kor; int suly; }; void main() { macska cirmi;

Programozási Nyelvek: C++

C# osztálydeníció. Krizsán Zoltán 1. .net C# technológiák tananyag objektum orientált programozás tananyag

Átírás:

Számítógép és programozás 2 10. Előadás Öröklődés http://digitus.itk.ppke.hu/~flugi/

Tagfüggvény struct Particle { int x,y; unsigned char r,g,b; void rajzol() { gout << move_to(x, y) << color (r, g, b) << dot; ; Particle p; p.rajzol();

Tagfüggvényhasználat Elsődleges szerep: a típus saját műveleteinek nyelvi egysége az adatokkal A típus: adat és művelet Jótékony hatása: Az adatmezőkre hivatkozás feleslegessé válik Ezért funkció változtatáskor sokszor elég a tagfüggvényekhez nyúlni Ezek a programkód jól meghatározható részét alkotják, nem lesz kifelejtve semmi

Speciális tagfüggvények Konstruktor Destruktor Másoló konstruktor Értékadó operátor Ezek mindegyike objektum létrejöttével, megszűnésével, vagy másolásával foglalkoznak Ha te nem írsz, akkor is van!

Programozási stratégia Milyen szerepű típusokat használjunk? Ez a legnehezebb (olyan mint az ultiban a licit) Beleértendő a teljes tagfüggvény készlet A kiválasztott típusokat hogyan reprezentáljuk? A tagfüggvények implementálása az adott reprezentációval Főprogram megírása a típusokkal Kritika: akkor sok hasonló szerepű típusnál sok hasonló tagfüggvényt kell leírni. Hogyan lehetne ezen spórolni?

Öröklődés A struct megfogalmazásánál azzal kezdjük, hogy a struct tartalmaz minden mezőt és tagfüggvényt, ami egy másik, már meglevő structban van, és ezt bővítjük Ha akarjuk, akár felülbírálhatunk néhány tagfüggvényt is, de az egyformákat nem kell újra megírni. Ilyet sima függvényekkel nem lehet csinálni, a tagfüggvényhasználat egyik legfontosabb oka ez

Példa öröklődésre: Ős struct Particle { int x,y; void torol() { gout << move_to(x, y) << color (0, 0, 0) << dot; void rajzol() { gout << move_to(x, y) << color (255, 255, 255) << dot; ;

Példa öröklődésre: Ős és örökös struct Particle { int x,y; void torol() { gout << move_to(x, y) << color (0, 0, 0) << dot; void rajzol() { struct gout << ColorParticle move_to(x, y) : public Particle { << color unsigned (255, char 255, r,g,b; 255) ; << dot; void rajzol() { ; gout << move_to(x, y) << color (r, g, b) << dot;

Példa öröklődésre: Ős és örökös struct Particle { int x,y; void torol() { gout << move_to(x, y) << color (0, 0, 0) << dot; void rajzol() { struct gout << ColorParticle move_to(x, y) : public Particle { << color unsigned (255, char 255, r,g,b; 255) << dot; void rajzol() { gout << move_to(x, y) Colorparticle ; c; << color (r, g, b) c.x=c.y=100; c.r=255; << dot; c.g=c.b=128; c.rajzol(); // refresh c.torol(); ; c.x+=5; c.rajzol(); // refresh

Öröklődés Jelölése: struct Os {.. ; struct Orokos : public Os {.. ; Elnevezések: Ős, ősosztály, bázis Örökös, leszármazott A : az örökítés jele itt is, mint a konstruktornál A public azt jelenti, hogy az ős láthatósági viszonyait változtatás nélkül vesszük át.

Az is a reláció struct A { ; struct B : public A { ; int main() { A a; B b; a=b; b=a; Garantálva van, hogy minden mező létezik

Öröklődés Ezzel a lehetőséggel megspórolhatunk hasonló tartalmú kódrészleteket, ami hasznos, mert Adott funkció csak egyszer szerepel, ha változtatni kell, elég egy helyen változtatni A forráskód rövidebb, tehát átláthatóbb, és kevesebb a hibalehetőség Hamarabb készen van a program, mert nem kell sokat gépelni Ugyanakkor ez a lehetőség egy újfajta gondolkodást igényel: eleve érdemes úgy tervezni, hogy koncentrálunk a hasonlóságokra

Tervezés öröklődéssel Észrevettem, hogy szükség van hasonló dolgokra, mi a teendő? Van átfedés a mezők között? (pl mindegyiknek koordinátái vannak) Van átfedés a műveletek között? (pl mindegyiket ki lehet rajzolni) Van különbség funkcióban? (pl. nincs, ha csak a színükben különböznek, de van, ha másképp mozognak) Ha ezekre a kérdésekre igen a válasz, érdemes megfontolni az öröklődést

Öröklődés Van tehát A és B típusom, amik között átfedés van, és funkcióbeli különbség Elkészítem a C nevű őst, amiben kizárólag a közös van benne Utána az A-t és a B-t úgy, hogy örökölnek C-től, és a különbségek vannak bennük leírva Végül használom A-t és B-t, és a közös tagfüggvények csak egyszer vannak megírva

Öröklődés struct Futo : public Sakkbabu { bool szabalyos(int cx, int cy); ; struct Bastya : public Sakkbabu { bool szabalyos(int cx, int cy); ;

Öröklődés struct Sakkbabu { int x,y; void lep(int cx, int cy) { x=cx; y=cy; bool szabalyos(int cx, int cy) { //ez a bábu típusától függ ;

Öröklődés struct Sakkbabu { int x,y; void lep(int cx, int cy) { if (szabalyos(cx,cy)){ x=cx; y=cy; bool szabalyos(int cx, int cy) { //ez a bábu típusától függ ;

Ez lenne kényelmes int main() { vector<sakkbabu> babuk(16); babuk[0] = valahogy Futo babuk[1] = valahogy Bastya bool sakkban=false; for (int i=0;i<babuk.size();++i){ if (babuk[i].szabalyos(kirx, kiry){ sakkban=true;

Mi a technikai korlát? A típus fix, ha a vector Sakkbabut tartalmaz, akkor a Sakkbabu tagfüggvénye fog meghívódni, nem a leszármazottaké Egy közönséges változónak nem lehet egyszerre két típusa is. Kéne egy olyan konstrukció, ami lehetővé teszi, hogy két típusa legyen egy változónak, egy amivel deklaráljuk, egy ami szerint tagfüggvénye hívódik futás közben dőlhessen el ez utóbbi

Dinamikus változó int main() { int a=0; int b(0); int *m = new int(0); cout << a; cout << b; cout << *m; Típus* : mutató *mutató : mutatott érték new : kérünk memóriát most delete : felszabadítás delete m; veszélyes!

Mutatók A mutató veszélyes, mert ha nem olyan memóriaterületre mutat, ami a mienk, akkor a program lefagy ha nem oda mutat, ahová gondoljuk, nehezen magyarázható hibás működést kapunk meglepően sok dolgot lehet mutatóval csinálni, pl. lehet hozzáadni számot, hogy mennyivel odébb mutasson. Ha elírsz valamit, jó eséllyel lefordul, és nem azt csinálja, amit vársz. nem lehet eldönteni a mutatóról, hogy érvényes-e kivétel a nullába mutató mutató: nullmutató. Az tuti nem.

A mutató biztonságos használata A mutatód egyszer kap értéket, itt egy new szerepel, definiáláskor. A mutatód soha többet nem kap másik értéket, csak a mutatott értékét használod. Mindig ugyanoda mutat. Ha már nincs szükség a mutatott területre, a delete garantáltan egyszer hívódik meg, és a delete után soha nem történik hivatkozás a mutatott területre pl ha mutató a mező, akkor a destruktorban delete

Mutatók Mutatót azért jó használni, mert Mindig annyi memóriát használ a program, amennyi kell. Menet közben változhat. C programok sok mutatót használnak, ha nem ismered, nem tudod felhasználni ezek részeit Olyan, mint a referencia, csak figyelni kell és mert lehetőség van arra, hogy kétféle típusunk legyen!

Statikus és dinamikus típus struct A { ; struct B : public A { ; int main() { A *m = new B; Statikus Dinamikus Statikus típus: a deklaráció típusa Dinamikus típus: a példányosítás típusa Ez utóbbi menet közben dől el

A dinamikus típus fordításkor ismeretlen struct A { ; struct B : public A { ; struct C : public A { ; int main() { A *m; if (rand()%2) { m = new B; else { m = new C; // m dinamikus típusa fordítási időben nem ismert

Folytatjuk... A következő epizód tartalmából: A virtual módosító tagfüggvényeknél Mire kell figyelni a konstruktor megírásakor Mi az a virtuális destruktor Láthatóság megszorítása És egy teljes példa, amin az eddig látottakat mindenki megérti