GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és. Függvénysablonok

Hasonló dokumentumok
Objektumorientált szoftverfejlesztés alapjai

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

1. Bevezetés A C++ nem objektumorientált újdonságai 3

Programozási alapismeretek 4.

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

Katona József Király Zoltán. Objektumorientált szoftverfejlesztés C++ nyelven

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.

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

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?

GTL Graphical Template Library

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

Programozási nyelvek Java

OOP. Alapelvek Elek Tibor

C++ programozási nyelv

Programozási nyelvek (ADA)

C++ referencia. Izsó Tamás február 17. A C++ nyelvben nagyon sok félreértés van a referenciával kapcsolatban. A Legyakoribb hibák:

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Már megismert fogalmak áttekintése

Bevezetés a Programozásba II 2. előadás. Adattípusok megvalósítása egységbe zárással. Adattípusok megvalósítása egységbe zárással

Programozási nyelvek Java

Programozás C és C++ -ban

A TANTÁRGY ADATLAPJA

Programozás I. gyakorlat

Interfészek. PPT 2007/2008 tavasz.

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.

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

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

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

JAVA PROGRAMOZÁS 2.ELŐADÁS

Programozási nyelvek JAVA EA+GY 1. gyakolat

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

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

Java V. Osztályszint. lyszintű ű tagok. Példányváltozó. Osztályváltozó. Általános Informatikai Tanszék Utolsó módosítás:

1. Egyszerű (primitív) típusok. 2. Referencia típusok

Generikus osztályok, gyűjtemények és algoritmusok

JUnit. JUnit használata. IDE támogatás. Parancssori használat. Teszt készítése. Teszt készítése

Programozási nyelvek II.: JAVA

Programozási nyelvek II.: JAVA

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

C++ programozási nyelv Konstruktorok-destruktorok

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

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

Programozási technológia

S0-02 Típusmodellek (Programozás elmélet)

Osztályok. 4. gyakorlat

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ó

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

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

Objektum orientált kiterjesztés A+ programozási nyelvhez

OOP: Java 11.Gy: Enumok, beágyazott osztályok. 13/1 B ITv: MAN

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

OOP #14 (referencia-elv)

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

Java III. I I. Osztálydefiníció (Bevezetés)

Szoftvertechnolo gia gyakorlat

OOP alapok Egy OOP nyelvet három fontos dolog jellemez. egységbezárás ( encapsulation objektumoknak öröklés ( inheritance

Programozás I. Első ZH segédlet

Alprogramok, paraméterátadás

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

Java és web programozás

A TANTÁRGY ADATLAPJA

Adatbázis és szoftverfejlesztés elmélet

Programozási nyelv Java

Java VII. Polimorfizmus a Java nyelvben

Unit Teszt. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) Unit Teszt / 22

Objektumorientált paradigma és a programfejlesztés

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

Java és web programozás

A programozás alapjai 1 Rekurzió

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

500.AA Megoldo Arisztid 500.A

Java III. I I. Osztálydefiníció (Bevezetés)

Java VII. Polimorfizmus a Java nyelvben

Programstrukturáló utasítások

Programozási nyelvek II.: JAVA

Objektumorientált programozás IX. Osztályok, objektumok

Objektumorientált paradigma és programfejlesztés Bevezető

Podoski Péter és Zabb László

Vizuális, eseményvezérelt programozás XI.

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

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

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

A C# programozási nyelv alapjai

Gregorics Tibor Tanácsok modularizált programok készítéséhez 1

Eseménykezelés. Szoftvertervezés és -fejlesztés II. előadás. Szénási Sándor.

Globális operátor overloading

Programzás I gyakorlat

és az instanceof operátor

Egy Erlang refaktor lépés: Függvényparaméterek összevonása tuple-ba

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

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

Alkalmazott modul: Programozás 4. előadás. Procedurális programozás: iteratív és rekurzív alprogramok. Alprogramok. Alprogramok.

Challenge Accepted:C++ Standard Template Library

Az UPPAAL egyes modellezési lehetőségeinek összefoglalása. Majzik István BME Méréstechnika és Információs Rendszerek Tanszék

Programozási nyelvek II. JAVA EA+GY 1. gyakolat

Algoritmizálás és adatmodellezés tanítása 1. előadás

500. AA Megoldó Alfréd AA 500.

Az alábbi példában a Foo f(5); konstruktor hívása után mennyi lesz f.b értéke? struct Foo { int a, b; Foo(int c):a(c*2),b(c*3) {} };

1) Hány byte-on tárol a C++ egy karaktert (char)? implementáció-függő ( viszont lásd 79. megjegyzés ) 1 8 4

Algoritmusok Tervezése. 4. Előadás Visual Basic 1. Dr. Bécsi Tamás

Átírás:

GENERIKUS PROGRAMOZÁS Osztálysablonok, Általános felépítésű függvények, Függvénynevek túlterhelése és Függvénysablonok Gyakorlatorientált szoftverfejlesztés C++ nyelven Visual Studio Community fejlesztőkörnyezetben @Katona József Kővári Attila Lektorálta: Kratzmajer Zoltán Publio Kiadó Felelős kiadó: Publio Kiadó Kft. 2016 Minden jog fenntartva! DOI: 10.18395/generikus.programozas.2016

Előszó A C++ programozási nyelv egy általános célú, magas szintű nyelv. A nyelv elterjedtségét és létjogosultságát támassza alá, hogy szinte minden operációs rendszer alá létezik C++ fordító. A C++ nyelv elsajátításához szükséges a C nyelv ismerete is, mivel a C++ általánosságban a C nyelv szintaxisára és koncepcióira épül, annak kiterjesztése. E könyv a C++ nyelven történő objektumorientált szoftverfejlesztést megismertető sorozat harmadik kötete, mely sorozat gyakorlati példákon keresztül segíti a nyelv elsajátítását. Bízunk benne, hogy azok, akik végigolvassák a könyvet, és kidolgozzák a példákat, alkalmazás szintjén megismerik a C++ nyelvi elemei által adott lehetőségeket, a nyelv logikáját, az átláthatóbb szoftver készítést elősegítő funkcióját és mélyebben elsajátítják az objektumorientált szemlélet alapjait, mely a hatékonyan szoftverfejlesztéshez elengedhetetlen. A bemutatott ismeretek gyakorlati példákkal illusztráltak, melyek a megértést és az alkalmazás elsajátítását is nagymértékben segítik. Jelen kötet a generikus programozásban használt osztálysablont, általános felépítésű függvényt, függvénynév túlterhelést, függvénysablont és ezen fogalmak kapcsolatát ismerteti, továbbá egy projekten keresztül lépésről-lépésre bemutatja ezeknek a nyelvi eszközöknek a használatát és jelentőségét. A mintapélda a könyvsorozat első kötetében bemutatott Visual Studio Community fejlesztőkörnyezetben kerül megvalósításra, melyben a bemutatott mintapélda implementálható és összeállítható, a futtatható kód előállítható. Köszönettel tartozunk a kézirat lektorának, Kratzmajer Zoltánnak szakmai tanácsaiért és módszertani javaslataiért. A Szerzők

Generikus programozás A generikus programozási paradigma során használt sablonok (templates) és a hozzájuk rendelt típusok, mint formális paraméterek, lehetőséget kínálnak a programozók számára, hogy egy logikailag egymással kapcsolatban álló osztályok és függvények csoportját hozzák létre. A könyvsorozat első és második kötetében egy adott függvény paraméter értékeit adott jellemzően primitív (integer, double, char, string, bool stb) típussal használtuk. A generikus programozás bármilyen más paradigmával (strukturált, objektumorientált) használható, célja, hogy adattípustól függetlenül képesek legyünk újra felhasználni kódrészleteket. A sablonok lehetőséget kínálnak arra, hogy általános típussal dolgozzunk, ahelyett, hogy úgynevezett meghatározott típusokat használnánk. Az ilyen jellegű programozási technika alkalmazásánál a fordító (nem a futtató rendszer) feladata, hogy egy sablon helyére megfelelő típussal helyettesítse be a használni kívánt változót, mindazonáltal fordítási időben szabadon paraméterezhető. Az osztályok és függvények akkor válnak teljessé, ha azok hívásra kerülnek. A keretrendszer fejlesztők gyakran használnak sablonokat, ugyanis, ha például egy függvényt fel szeretnénk használni több, eltérő típussal, akkor nem szükséges minden egyes típus esetén új metódust implementálnunk, mivel a sablonok használatával elég azt csak egyszer megírnunk és a hívásakor átadni neki azt a típust, amivel dolgozni szeretnénk. Összefoglalva a generikus programozás megközelítésének lényege, hogy a sablont és a hozzá tartozó szemantikát a programozó határozza meg, minden egyéb a fordítóprogram felelőssége. Az osztályokat, függvényeket nemcsak értékekkel, hanem egy vagy több típussal is paraméterezünk. Generikus programozás növeli az újrafelhasználás mértékét, hiszen típusoktól független algoritmusokat lehet a segítségével megvalósítani. Szokás parametrikus polimorfizmusnak is nevezni. A C++ nyelven függvény- és az osztálysablonok (templates) készítésével valósítható meg a többféle típussal történő paraméterezés, mint például egy osztálysablon esetén: template <class T> Osztálynév<T>::Függvénynév(T paraméter). Osztálysablonok A típussablonnal paraméterezett osztály (generic class), lehetővé teszi, hogy más osztályok definiálásához a paraméterezett osztályt felhasználjuk, ezáltal egy adott osztálydefiníció minden típus esetén alkalmazható lesz. Tehát az osztály példányosítása során átadjuk azt a típust, amellyel használni szeretnénk az osztályunkat, majd ha más típussal szeretnénk tovább dolgozni, akkor nincs más teendő, mint új objektumpéldány létrehozása és a megfelelő típus átadása. A fentebb megismert osztálysablon fogalmak gyakorlati elsajátításához a következőkben leírt minta feladat tervezését és implementálását végezzük el. A típussablonnal paraméterezett osztály (generic class), lehetővé teszi, hogy más osztályok definiálásához a paraméterezett osztályt felhasználjuk, ezáltal egy adott osztálydefiníció minden típus esetén alkalmazható lesz. Tehát az osztály példányosítása során átadjuk azt a típust, amellyel szeretnénk használni az osztályunkat, majd ha más típussal szeretnénk tovább dolgozni, akkor nincs más teendő, mint új objektumpéldány létrehozása és a megfelelő típus átadása. A fentebb megismert osztálysablon fogalmak gyakorlati elsajátításához a következőkben leírt minta feladat tervezését és implementálását végezzük el.

Mintapélda Visual Studio Community fejlesztőkörnyezetben Írjunk egy Ikozaéder osztályt (Ikozaeder), amely számításokat végez a poliéderen. Vegyük figyelembe, hogy az ikozaéder szó alatt szabályos ikozaédert értünk, amely az öt platóni vagy szabályos test egyike, konvex, szabályos poliéder és húsz háromszöglap alkotja, amelyekből a csúcsokon öt-öt találkozik. Az osztály adattagjai a következőek: a, a szabályos ikozaéder él hossza. Ügyeljünk az egységbezárás elvére, tehát az adattag(ok) private elérésűek legyenek! Valósítsuk meg az osztály metódusait: Írjuk meg az osztály konstruktorát, mely kötelező jelleggel paraméterül várja a szabályos ikozaéder él hosszát. A konstruktor megvalósításnál alapértelmezett paraméteres konstruktort használjunk. Írjunk egy FelszinSzamol() függvényt, amely az alábbi képlet segítségével: kiszámolja a szabályos ikozaéder felszínét (A). Írjunk egy TerfogatSzamol() függvényt, amely az alábbi képlet segítségével: kiszámolja a szabályos ikozaéder térfogatát (V).