C++ programozási nyelv Gyakorlat - 7. hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. november A C++ programozási nyelv Soós Sándor 1/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 nyelv Soós Sándor 2/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 nyelv Soós Sándor 3/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 objektumorientá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 nyelv Soós Sándor 4/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: http://pigseye.kennesaw.edu/~dbraun/csis4650/a&d/u ML_tutorial/class.htm A C++ programozási nyelv Soós Sándor 5/17
UML: Unified Modeling Language A C++ programozási nyelv Soós Sándor 6/17
Példa: Személy-Diák class Szemely { intkor; double Suly; 1. megoldás: class Diak { intkor; double Suly; double TanAtlag; 2. megoldás: class Szemely { intkor; double Suly; double TanAtlag; //ezt nem használjuk, ha nem diák A C++ programozási nyelv Soós Sándor 7/17
Az igazi megoldás: örökítés 3. megoldás: class Diak : public Szemely { double TanAtlag; 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! int main() { Szemely sz; sz.suly = 75; Diak d; d.suly = 63; d.kor = 22; d.tanatlag = 3.8; return 0; A C++ programozási nyelv Soós Sándor 8/17
Ugyanez kompozícióval class Diak { Szemely SzemelyiAdatok; doubletanatlag; 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. int main() { Diak d; d.szemelyiadatok.suly = 63; d.tanatlag = 3.8; return 0; A C++ programozási nyelv Soós Sándor 9/17
Tagfüggvények örökítése class Szemely { void Beszel() { printf( "beszélek\n" ); } class Diak : public Szemely { void Vizsgazik() { printf( "jaj\n" ); } int main() { Diak d; d.beszel(); d.vizsgazik(); return 0; A C++ programozási nyelv Soós Sándor 10/17
Ugyanez kompozícióval class Szemely { void Beszel() { printf( "beszélek\n" ); } class Diak { Szemely Szemely_Resz; void Vizsgazik() { printf( "jaj\n" ); } int main() { Diak d; d.szemely_resz.beszel(); d.vizsgazik(); return 0; A C++ programozási nyelv Soós Sándor 11/17
Konstruktorok, destruktorok class Szemely { Szemely() { printf( "Szemely konstruktor\n" ); } ~Szemely() { printf( "Szemely destruktor\n" ); } class Diak : public Szemely { Diak() { printf( "Diak konstruktor\n" ); } ~Diak() { printf( "Diak destruktor\n" ); } int main() { Diak d; return 0; } Mit ír ki? Szemely konstruktor Diak konstruktor Diak destruktor Szemely destruktor A C++ programozási nyelv Soós Sándor 12/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 nyelv Soós Sándor 13/17
Szintetizált konstruktor Mi történik akkor, ha én nem definiálom a szükséges konstruktorokat? class Szemely { Szemely() { printf( "Szemely konstruktor\n" ); } class Diak : public Szemely { int main() { Diak d; 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 nyelv Soós Sándor 14/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 { Szemely( int K, double S) { Kor = k; Suly = S; } int Kor; double Suly; class Diak : public Szemely { 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 nyelv Soós Sándor 15/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 { void Eltesz() { db.eltesz(); } Adatbazis db; 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 nyelv Soós Sándor 16/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 A C++ programozási nyelv Soós Sándor 17/17