A C++ programozási nyelvSoós Sándor 1/17 C++ programozási nyelv Gyakorlat - 7. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor november
A C++ programozási nyelvSoós Sándor 2/17 Tartalomjegyzék ● Házi feladatok ● Örököltetés, leszármaztatás ● Terminológia ● UML: Unified Modeling Language ● Példa: Személy-Diák ● Az igazi megoldás: örökítés ● Ugyanez kompozícióval ● Tagfüggvények örökítése ● Ugyanez kompozícióval ● Konstruktorok, destruktorok ● Tanulság ● Szintetizált konstruktor ● A default konstruktor hiánya? ● Példa kompozícióra ● Példa: Geometriai objektumok
A C++ programozási nyelvSoós Sándor 3/17 Házi feladatok ● Ezekből fog kialakulni a laborjegy, ezért is fontos, de... – a programozást nem lehet másképp megtanulni, mint hogy nekiállunk programokat írni. – meg kell szenvedni azért, hogy elkészüljenek az első önálló programjaink – becsaphatjuk saját magunkat azzal, hogy ezt megspóroljuk (nem írjuk meg a házi feladatot, vagy másolatot adunk be), de e nélkül nem lehet megtanulni a programozást. ● Mostantól életbe lépnek a múlt héten bemutatott szabályok. ● Mostantól osztályozni fogjuk a beadott házi feladatokat, minden nap késés 1 jegy levonás! ● A jövő héten itt az órán kell majd elkészíteni egy programot, amit az óra végén be kell adni osztályzásra.
A C++ programozási nyelvSoós Sándor 4/17 Örököltetés, leszármaztatás ● Az objektum-orientált nyelvek talán legfontosabb újítása. ● A hagyományos nyelvekben nem létezik hasonló fogalom. ● Különböző nyelvek és tankönyvek eltérő terminológiát és jelölésmódot használnak. ● Ezek mind hasonló elveket takarnak. ● Ezeket egyszer kell alaposan megérteni, ezután a különböző nyelvekben jól felhasználhatjuk ezt a tudást. ● Tehát most nem csak C++ -t tanulunk, hanem objektum- orientált programtervezést és gondolkodásmódot is. ● Ha ezt jól elsajátítottuk, visszatekintve nagyon nehéz lesz elképzelni, hogy korábban hogyan programoztunk és gondolkoztunk másképp!
A C++ programozási nyelvSoós Sándor 5/17 Terminológia ● Elnevezések: – örököltetés, öröklés, örökítés, leszármaztatás, inheritance, kiterjesztés, extends (Java) – A: alap, bázis, ős, szülő osztály, base class, parent – B: leszármaztatott, gyerek, örököltetett, leszármazott osztály, child – Ezek alatt ugyanazt értjük! – B egy bizonyos fajta A ● Jelölés: UML Tutorial: – ML_tutorial/class.htm
A C++ programozási nyelvSoós Sándor 6/17 UML: Unified Modeling Language
A C++ programozási nyelvSoós Sándor 7/17 Példa: Személy-Diák class Szemely { public: intKor; doubleSuly; }; 1. megoldás: class Diak { public: intKor; doubleSuly; doubleTanAtlag; }; 2. megoldás: class Szemely { public: intKor; doubleSuly; doubleTanAtlag; //ezt nem használjuk, ha nem diák };
A C++ programozási nyelvSoós Sándor 8/17 Az igazi megoldás: örökítés 3. megoldás: class Diak : public Szemely { public: double TanAtlag; }; int main() { Szemelysz; sz.Suly = 75; Diakd; d.Suly = 63; d.Kor = 22; d.TanAtlag = 3.8; return 0; }; ● A leszármazott tartalmazza az ős tulajdonságait. ● Fontos: A gyerekben nem kell külön minősíteni, hogy honnan származik egy adott tulajdonság!
A C++ programozási nyelvSoós Sándor 9/17 Ugyanez kompozícióval class Diak { public: Szemely SzemelyiAdatok; doubleTanAtlag; }; int main() { Diakd; d.SzemelyiAdatok.Suly = 63; d.TanAtlag = 3.8; return 0; }; ● A két megoldás hasonlít egymáshoz. ● Valószínűleg majdnem minden feladat megoldható mindkét módon. ● Hogy mikor melyik célszerűbb, az egy megvizsgálandó kérdés.
A C++ programozási nyelvSoós Sándor 10/17 Tagfüggvények örökítése class Szemely { public: void Beszel() { printf( "beszélek\n" ); } }; class Diak : public Szemely { public: void Vizsgazik() { printf( "jaj\n" ); } }; int main() { Diakd; d.Beszel(); d.Vizsgazik(); return 0; };
A C++ programozási nyelvSoós Sándor 11/17 Ugyanez kompozícióval class Szemely { public: void Beszel() { printf( "beszélek\n" ); } }; class Diak { public: SzemelySzemely_Resz; void Vizsgazik() { printf( "jaj\n" ); } }; int main() { Diakd; d.Szemely_Resz.Beszel(); d.Vizsgazik(); return 0; };
A C++ programozási nyelvSoós Sándor 12/17 Konstruktorok, destruktorok class Szemely { public: Szemely() { printf( "Szemely konstruktor\n" ); } ~Szemely() { printf( "Szemely destruktor\n" ); } }; class Diak : public Szemely { public: Diak() { printf( "Diak konstruktor\n" ); } ~Diak() { printf( "Diak destruktor\n" ); } }; int main() { Diakd; return 0; } Mit ír ki? Szemely konstruktor Diak konstruktor Diak destruktor Szemely destruktor
A C++ programozási nyelvSoós Sándor 13/17 Tanulság ● Különböző objektum-orientált nyelvek eltérően rendezik a konstruktorok és destruktorok kérdését: ● C++ – automatikusan lefut az ős konstruktora, ill. destruktora – nem is tudom én magam meghívni az ős konstruktorát – A sorrend logikája: ● Az őst inicializálom előbb, mert a gyerek már felhasználhat ebből valamit. ● Például a diák évfolyama függhet az életkorától ● Delphi (Pascal) – nekem kell gondoskodnom az ős konstruktorának, ill. destruktorának meghívásáról – ha akarom el is hagyhatom
A C++ programozási nyelvSoós Sándor 14/17 Szintetizált konstruktor ● Mi történik akkor, ha én nem definiálom a szükséges konstruktorokat? class Szemely { public: Szemely() { printf( "Szemely konstruktor\n" ); } }; class Diak : public Szemely { }; int main() { Diakd; return 0; } Mit ír ki? Szemely konstruktor Ez akkor is így van, ha a Diakban definiálok egy üres konstruktort. A destruktornál ugyanez a helyzet.
A C++ programozási nyelvSoós Sándor 15/17 A default konstruktor hiánya? ● Mi történik akkor, ha a fordító nem képes szintetizálni a default konstruktort? class Szemely { public: Szemely( int K, double S) { Kor = k; Suly = S; } intKor; doubleSuly; }; class Diak : public Szemely { public: double TanAtlag; }; int main() { Diak d; return 0; }; Mi történik ekkor? Mi történik akkor, ha a Diaknak definiálok default konstruktort? Tanulság: Ha definiálunk valamilyen konstruktort, akkor definiáljunk default konstruktort is!
A C++ programozási nyelvSoós Sándor 16/17 Példa kompozícióra ● Van olyan eset, amikor egyértelmű, hogy inkább a kompozíciót választjuk az örökítés helyett: class Szemely { public: void Eltesz() { db.Eltesz(); } Adatbazisdb; }; – Ebben az esetben nem jut eszünkbe a Szemelyt örökíteni az Adatbazisból – Az Adatbazis egy szolgáltatást nyújt a Szemelynek – Nem pedig a Szemely bővíti ki az Adatbazist!
A C++ programozási nyelvSoós Sándor 17/17 Példa: Geometriai objektumok ● Tervezzük meg és készítsük el egy geometriai oktató program alaposztályait! – Pont – Szakasz – Egyenes – Kör – Körcikk – Ellipszis – Négyszög – Téglalap (a tengelyekkel párhuzamos állású) – Négyzet (a tengelyekkel párhuzamos állású) – Rombusz (két oldala a tengelyekkel párhuzamos állású) – Háromszög – Speciális háromszögek