Objektum elvű alkalmazások fejlesztése. Öröklődés. Készítette: Sike Sándor Gregorics Tibor

Hasonló dokumentumok
Objektum elvű alkalmazások fejlesztése. Öröklődés. Készítette: Sike Sándor Gregorics Tibor

Elemi Alkalmazások Fejlesztése II.

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

Tervminták I. (Sablonfüggvény, Stratégia, Egyke, Látogató) Testek térfogata Lények túlélési versenye

Programozás C++ -ban 2007/4

117. AA Megoldó Alfréd AA 117.

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

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

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

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

Osztály és objektum fogalma

Származtatási mechanizmus a C++ nyelvben

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

A C++ öröklés. (Előfeltétel: 12. tétel ismerete)

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

STL. Algoritmus. Iterátor. Tároló. Elsődleges komponensek: Tárolók Algoritmusok Bejárók

Géptermi zh-írás forgatókönyve

PHP II. WEB technológiák. Tóth Zsolt. Miskolci Egyetem. Tóth Zsolt (Miskolci Egyetem) PHP II / 19

C# osztályok. Krizsán Zoltán

Emlékeztető: a fordítás lépései. Szimbólumtábla-kezelés. Információáramlás. Információáramlás. Információáramlás.

Java VI. Egy kis kitérő: az UML. Osztály diagram. Általános Informatikai Tanszék Utolsó módosítás:

Objektumorientált programozás C# nyelven

Objektumorientált programozás C# nyelven

Maximum kiválasztás tömbben

Térgeometria feladatok. 2. Egy négyzetes oszlop magassága háromszor akkora, mint az alapéle, felszíne 504 cm 2. Mekkora a testátlója és a térfogata?

Osztály szint tagok. Krizsán Zoltán 1 [2012. március 12.] Objektumorientált programozás C# alapokon tananyag

1. Alapok. Programozás II

Programozás II. ATM példa Dr. Iványi Péter

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

500. AA Megoldó Alfréd AA 500.

Programozás II gyakorlat. 6. Polimorfizmus

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

Bánsághi Anna

Programozás C++ -ban

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

500. CC Megoldó Alfréd CC 500.

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

JAVA PROGRAMOZÁS 3.ELŐADÁS

C# nyelv alapjai. Krizsán Zoltán 1. Objektumorientált programozás C# alapokon tananyag. Általános Informatikai Tanszék Miskolci Egyetem

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

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.

Körkörös listák. fej. utolsó. utolsó. fej

Dinamikus csatolású függvénykönyvtár készítése és használata Plugin-szerű betöltés Egyszeű C++ osztályok készítése

3. Gyakorlat Ismerkedés a Java nyelvvel

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

128. AA Megoldó Alfréd AA 128.

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 programozásba Előadás: Objektumszintű és osztályszintű elemek, hibakezelés

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

0.2.1 Operátorok túlterhelése (műveletek definiálhatók felhaszn. típusokra) Kutya. Eb1. Eb2. Név (txt): Rex. Blöki. Német juhász 3

Tartalomjegyzék. Bevezetés...2

Informatikai Kar. 4. fejezet. Giachetta Roberto

Osztályok. 4. gyakorlat

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

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

Események C#-ban Krizsán Zoltán iit

Bevezetés a programozásba 2

Objektumorientált programozás C# nyelven

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Programozási nyelvek Java

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

OBJEKTUM ORIENTÁLT PROGRAMOZÁS JAVA NYELVEN. vizsgatételek

500. DD Megoldó Alfréd DD 500.

Java és web programozás

3. Osztályok II. Programozás II

Objektumok inicializálása

Elemi alkalmazások fejlesztése IV. Adatbázis-kezelő GUI alkalmazás készítése 3. Összetett tábla karbantartása

Kalapácsvetés 2016 szöveges

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

Bevezetés a C++ programozásba

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

Programozási nyelvek Java

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

Objektumorientált programozás C# nyelven III.

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

.AA Megoldó Alfréd AA.

Programozás II. 6.Öröklés Dr. Iványi Péter

Objektum elvű alkalmazások fejlesztése. Verem típus osztály-sablonja

Magas szintű programozási nyelvek 2 Előadás jegyzet

1 Rev 4. A C++ programozás alapjai- segédlet

Egységes és objektumközpontú adatbázis-kezelés (2. rész)

BME MOGI Gépészeti informatika 8.

C++ programozási nyelv

Programozás C++ -ban

Bánsághi Anna

Java és web programozás

C# feladatok gyűjteménye

Objektumorientált programozás C# nyelven

- 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]++;

PHP5 Új generáció (2. rész)

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

OPERÁCIÓS RENDSZEREK 1. ÁTIRÁNYÍTÁSOK, SZŰRŐK

Rekurzió. Horváth Gyula.

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

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

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

Pénzügyi algoritmusok

INFORMATIKAI ALAPISMERETEK


Átírás:

Objektum elvű alkalmazások fejlesztése Öröklődés Készítette: Sike Sándor Gregorics Tibor

Készítsünk programot, amellyel testek térfogatát számolhatjuk ki, illetve megadhatjuk azt is, hogy az egyes testfajtákból hány objektum létezik! A lehetséges fajták: szabályos sokszögek: gömb, kocka, tetraéder, oktaéder; hasáb jellegű testek: henger, négyzet alapú és szabályos háromszög alapú hasáb; gúla jellegű testek: kúp, négyzetes gúla.

Test Szabályos Hasábféle Gömb Kocka Tetraéder Oktaéder Gúlaféle Henger Hasáb Hasáb Kúp Gúla

#méret -darab Test :double :int oldalhossz vagy sugár példányok darabszáma +térfogat():double -darab Szabályos :int Hasábféle #magasság :double -darab :int +térfogat() :double #szorzó() :double +térfogat() :double #alap() :double return méret*méret*méret*szorzó() return alap()*magasság

class Test virtual: a leszármazott osztályokban felülírható public: virtual ~Test(); absztrakt metódus virtual double terfogat() const = 0; absztrakt osztály static int darab() return _darab; protected: static: osztály szintű metódus Test(double meret); double _meret; az osztály absztrakt private: static int _darab; static: osztály szintű adattag ; int Test::_darab = 0; Test::Test(double meret) _meret = meret; ++_darab; Test::~Test() --_darab;

class Szabalyos : public Test public: ~Szabalyos(); felüldefiniálás double terfogat() const; static int darab() return _darab; protected: Szabalyos(double meret); virtual double szorzo() const = 0; private: static int _darab; ; int Szabalyos::_darab = 0; Szabalyos::Szabalyos(double meret) : Test(meret) ++_darab; Szabalyos::~Szabalyos() --_darab; double Szabalyos::terfogat() const return _meret * _meret * _meret * szorzo();

class Hasabfele : public Test public: ~Hasabfele (); double terfogat() const; static int darab() return _darab; protected: Hasabfele(double meret, double magassag); virtual double alap() const = 0; double _magassag; private: static int _darab; ; int Hasabfele::_darab = 0; Hasabfele::Hasabfele(double meret, double magassag): Test(meret) _magassag = magassag; ++_darab; Hasabfele::~Hasabfele () --_darab; double Hasabfele::terfogat() const return alap() * _magassag;

Szabályos -darab :int +térfogat() :double #szorzó() :double return méret*méret*méret*szorzó() Kocka Gömb Tetraéder Oktaéder -darab :int -darab :int -szorzó :double -darab :int -szorzó :double -darab :int -szorzó :double #szorzó():double #szorzó():double #szorzó():double #szorzó():double return 1 = 4π/3 = 2/12 = 2/3

class Kocka : public Szabalyos public: Kocka(double meret); ~Kocka(); static int darab() return _darab; protected: double szorzo() const return 1.0; private: static int _darab; ; int Kocka::_darab = 0; Kocka::Kocka(double meret) : Szabalyos(meret) ++_darab; Kocka::~Kocka() --_darab;

class Gomb : public Szabalyos public: Gomb(double meret); ~Gomb(); static int darab() return _darab; protected: double szorzo() const return _szorzo; private: const static double _szorzo = (4.0 * 3.14159) / 3.0; static int _darab; ; int Gomb::_darab = 0; Gomb::Gomb(double meret) : Szabalyos(meret) ++_darab; Gomb::~Gomb() --_darab;

class Tetraeder : public Szabalyos public: Tetraeder(double meret); ~Tetraeder(); static int darab() return _darab; protected: double szorzo() const return _szorzo; private: const static double _szorzo = 1.41421 / 12.0; static int _darab; ; int Tetraeder::_darab = 0; Tetraeder::Tetraeder(double meret) : Szabalyos(meret) ++_darab; Tetraeder::~Tetraeder() --_darab;

class Oktaeder : public Szabalyos public: Oktaeder(double meret); ~Oktaeder(); static int darab() return _darab; protected: double szorzo() const return _szorzo; private: const static double _szorzo = 1.41421 / 3.0; static int _darab; ; int Oktaeder::_darab = 0; Oktaeder::Oktaeder(double meret) : Szabalyos(meret) ++_darab; Oktaeder::~Oktaeder() --_darab;

Hasábféle #magasság :double -darab :int +térfogat():double #alap() :double return alap()*magasság Hasáb Henger Hasáb Gúlaféle -darab :int -darab :int -darab :int -darab :int #alap() :double +darab():int #alap() :double +darab():int #alap() :double +darab():int +térfogat() :double return méret*méret*π return (alap()*magasság)/3 return 3*méret*méret/4 return méret*méret

class Henger : public Hasabfele public: Henger(double meret, double magassag); ~Henger(); static int darab() return _darab; protected: double alap() const; private: static int _darab; ; int Henger::_darab = 0; Henger::Henger(double meret, double magassag) : Hasabfele(meret, magassag) ++_darab; Henger::~Henger() --_darab; double Henger::alap() const return 3.14159 * _meret * _meret;

class NegyzetesHasab : public Hasabfele public: NegyzetesHasab (double meret, double magassag); ~NegyzetesHasab (); static int darab() return _darab; protected: double alap() const; private: static int _darab; ; int NegyzetesHasab::_darab = 0; NegyzetesHasab::NegyzetesHasab (double meret, double magassag) : Hasabfele(meret, magassag) ++_darab; NegyzetesHasab::~NegyzetesHasab () --_darab; double NegyzetesHasab::alap() const return _meret * _meret;

class HaromszogesHasab : public Hasabfele public: HaromszogesHasab (double meret, double magassag); ~HaromszogesHasab (); static int darab() return _darab; protected: double alap() const; private: static int _darab; ; int HaromszogesHasab::_darab = 0; HaromszogesHasab::HaromszogesHasab (double meret, double magassag) : Hasabfele(meret, magassag) ++_darab; HaromszogesHasab::~HaromszogesHasab () --darab; double HaromszogesHasab::alap() const return 1.73205 * _meret * _meret / 4.0;

class Gulafele : public Hasabfele ; public: ~Gulafele(); double terfogat() const; újradefiniálás static int darab() return _darab; protected: Gulafele(double meret, double magassag); private: static int _darab; int Gulafele::_darab = 0; Gulafele::Gulafele(double meret, double magassag) : Hasabfele(meret, magassag) ++_darab; Gulafele::~Gulafele() --_darab; double Gulafele::terfogat() const return (alap() * _magassag) / 3.0;

Gúlaféle -darab :int +térfogat():double return (alap()*magasság)/3 -darab :int Kúp #alap() :double -darab :int Gúla #alap() :double return méret*méret*π return méret*méret Maradt redundancia a kódban:ilyen metódusokt már írtunk.

class Kup : public Gulafele public: Kup(double meret, double magassag); ~Kup(); static int darab() return _darab; protected: double alap() const; private: static int _darab; ; int Kup::_darab = 0; Kup::Kup(double meret, double magassag) : Gulafele(meret, magassag) ++_darab; Kup::~Kup() --_darab; double Kup::alap() const return 3.14159 * _meret * _meret;

class NegyzetesGula : public Gulafele public: NegyzetesGula(double meret, double magassag); ~ NegyzetesGula(); static int darab() return _darab; protected: double alap() const; private: static int _darab; ; int NegyzetesGula::_darab = 0; NegyzetesGula::NegyzetesGula(double meret, double magassag) : Gulafele(meret, magassag) ++_darab; NegyzetesGula::~NegyzetesGula() --_darab; double NegyzetesGula::alap() const return _meret * _meret;

#include <cstdlib> #include <iostream> #include <fstream> #include "test.h" using namespace std; int main() ifstream inp("testek.txt"); // ellenőrzés 8 Kocka 5.0 Henger 3.0 8.0 Henger 1.0 10.0 Tetraeder 4.0 NegyzetesGula 3.0 10.0 Oktaeder 1.0 Kocka 2.0 NegyzetesGula 2.0 10.0 testek.txt int testszam; inp >> testszam; Test **testek = new Test *[testszam]; Test *t = new Test[n] nem jó, mert a Test absztrakt. for ( int i = 0; i < testszam; ++i ) string tipus; double meret, magassag; // test létrehozása a fájl adott sora alapján inp.close();

inp >> tipus; if ( tipus == "Kocka" ) A származtatás miatt lehet értékül adni egy inp >> meret; Test* típusú változónak egy Kocka* pointert testek[i] = new Kocka(meret); else if ( tipus == "Gomb" ) inp >> meret; testek[i] = new Gomb(meret); else if ( tipus == "Tetraeder" ) inp >> meret; testek[i] = new Tetraeder(meret); else if ( tipus == "Oktaeder" ) inp >> meret; testek[i] = new Oktaeder(meret); else if ( tipus == "Henger" ) inp >> meret; inp >> magassag; testek[i] = new Henger(meret, magassag);

else if ( tipus == "NegyzetesHasab" ) inp >> meret; inp >> magassag; testek[i] = new NegyzetesHasab(meret, magassag); else if ( tipus == "HaromszogesHasab" ) inp >> meret; inp >> magassag; testek[i] = new HaromszogesHasab(meret, magassag); else if ( tipus == "Kup" ) inp >> meret; inp >> magassag; testek[i] = new Kup(meret, magassag); else if ( tipus == "NegyzetesGula" ) inp >> meret; inp >> magassag; testek[i] = new NegyzetesGula(meret, magassag); else cout << "Ismeretlen idom" << endl;

polimorfizmus: többalakúság for ( int i = 0; i < testszam; ++i ) cout << testek[i]->terfogat() << endl; dinamikus kötés: futás közben dől el, hogy ez milyen típusú pointer, és ettől függ, hogy melyik terfogat() metódus hívódik meg. cout << Test::darab() << " " << Szabalyos::darab() << " " << Hasabfele::darab() << " " << Gulafele::darab() << " " << Gomb::darab() << " " << Kocka::darab() << " " << Tetraeder::darab() << " " << Oktaeder::darab() << " " << Henger::darab() << " " << NegyzetesHasab::darab() << " " << HaromszogesHasab::darab() << " " << Kup::darab() << " " << NegyzetesGula::darab() << endl; for ( int i = 0; i < testszam; ++i ) delete testek[i]; delete [] testek; cout << Test::darab() << " " << Szabalyos::darab() << " " << Hasabfele::darab() << " " << Gulafele::darab() << " " << Gomb::darab() << " " << Kocka::darab() << " " << Tetraeder::darab() << " " << Oktaeder::darab() << " " << Henger::darab() << " " << NegyzetesHasab::darab() << " " << HaromszogesHasab::darab() << " " << Kup::darab() << " " << NegyzetesGula::darab() << endl; return 0;

Alapterület +terület(double):double virtual ~Alapterület() Körterület Háromszögterület +terület(double m):double +terület(double m):double return π*m*m Négyzetterület return 3*m*m/4 +terület(double m):double return m*m

Test Alapterület #méret -darab :double :int +térfogat():double A többalakúság miatt pointer lesz, amihez a konstruktor foglal helyet. +terület(double):double # alap -darab Szabályos :int +térfogat() :double #szorzó() :double Hasábféle # magasság : double - darab :int +térfogat() :double # alap:alapterület return méret*méret*méret*szorzó() return alap.terület(méret) * magasság

Hasábféle #magasság :double -darab :int # alap Alapterület +térfogat():double return alap->terület(méret) * magasság +terület(double):double Henger Hasáb Hasáb Gúlaféle -darab :int -darab :int -darab :int -darab :int +darab():int +darab():int +darab():int +térfogat() :double Kúp Gúla -darab :int +darab():int -darab :int +darab():int return (alap->terület(méret) *magasság)/3

NegyzetesHasab::NegyzetesHasab( ) : Hasabfele( ) ++_darab; _alap = new Negyzetterület(); NegyzetesHasab::~NegyzetesHasab() --_darab; delete _alap; 5 henger és 3 kúp összesen 8 körterület objektumot igényel NegyzetesGula::NegyzetesGula( ) : Gulafele( ) Henger::Henger( ) : Hasabfele( ) ++_darab; _alap = new Negyzetterület (); ++_darab; _alap = new Korterület (); NegyzetesGula::~NegyzetesGula() Henger::~Henger() --_darab; delete _alap; --_darab; delete _alap; Haromszoges::HaromszogesHasab( ) : Hasabfele( ) Kup::Kup( ) : Gulafele( ) ++_darab; _alap = new Haromszogterület (); ++_darab; _alap = new Korterület (); HaromszogesHasab::~HaromszogesHasab() Kup::~Kup() --_darab; delete _alap; --_darab; delete _alap;

Alapterület +terület(double):double Körterület - példány : Körterület* - Körterület() + terület(double m): double + példány() : Körterület* Négyzetterület - példány:négyzetterület* - Négyzetterület() + terület(double m):double + példány():négyzetterület* Háromszögterület - példány:háromszögterület* - Háromszögterület() + terület(double m):double + példány() : Háromszögterület* if ( példány == nil ) példány = new Körterület(); return példány; if ( példány == nil ) példány = new Négyzetterület(); return példány; if ( példány == nil ) példány = new Háromszögterület(); return példány;

class Negyzetterulet : public Alapterulet public: double terulet(double m) const return m * m; static Negyzetterulet *peldany(); private: static Negyzetterulet *_peldany; Negyzetterulet () ; Negyzetterulet *Negyzetterulet::_peldany = NULL; Negyzetterulet *Negyzetterulet::peldany() if ( _peldany == NULL ) _peldany = new Negyzetterulet(); return _peldany;

class Korterulet : public Alapterulet public: double terulet(double m) const return 3.14159 * m * m; static Korterulet *peldany(); private: static Korterulet *_peldany; Korterulet () ; Korterulet *Korterulet::_peldany = NULL; Korterulet *Korterulet::peldany() if ( _peldany == NULL ) _peldany = new Korterulet(); return _peldany;

class Haromszogterulet : public Alapterulet public: double terulet(double m) const return 1.73205 * m * m / 4.0; static Haromszogterulet *peldany(); private: static Haromszogterulet *_peldany; Haromszogterulet() ; Haromszogterulet *Haromszogterulet::_peldany = NULL; Haromszogterulet *Haromszogterulet::peldany() if ( _peldany == NULL ) _peldany = new Haromszogterulet(); return _peldany;

NegyzetesHasab::NegyzetesHasab( ) : Hasabfele( ) ++_darab; _alap = Negyzetterulet::peldany(); NegyzetesHasab::~NegyzetesHasab() --_darab; NegyzetesGula::NegyzetesGula( ) : Gulafele( ) ++_darab; _alap = Negyzetterulet::peldany(); NegyzetesGula::~NegyzetesGula() --_darab; Hol kellene megszűntetni az egyke objektumokat? Haromszoges::HaromszogesHasab( ) : Hasabfele( ) ++_darab; _alap = Haromszogterulet::peldany(); HaromszogesHasab::~HaromszogesHasab() --_darab; Henger::Henger( ) : Hasabfele( ) ++_darab; _alap = Korterulet::peldany(); Henger::~Henger() --_darab; Kup::Kup( ) : Gulafele( ) ++_darab; _alap = Korterulet::peldany(); Kup::~Kup() --_darab;