Programozás C++ osztályok Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék foa@almos.vein.hu 2010. április 8.
Csak bázisosztályként használt/értelmezhető osztály Elvont fogalmat jelenít meg Az absztrakt osztályokhoz általában nem léteznek objektumok (a nyelv megengedné) Általában virtuális függvények nem nagyon rendelhetőek az absztrakt osztályokhoz Például: Jármű (autó, motor, kerékpár, hajó, stb.) Alakzat (háromszög, négyszög, stb.) class CAlakzat virtual void Forgat(int) error("calakzat::rotate"); } virtual void Rajzol() error("calakzat::draw"); } CAlakzat alakz; Nincsen az alakzatról megadva semmi (értelmetlen) Minden műveletre hibát jelez Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 2 / 11
Tisztán virtuális (pure virtual) függvény Egy vitruális függvény az "=0" értékadástól lesz tisztán virtuális függvény Példa: class CAlakzat virtual void Forgat(double) = 0; virtual void Rajzol() = 0; Absztrakt osztálynak (elvont osztály, abstract class) Legalább egy tisztán virtuális függvénnyel rendelkezik Nem példányosítható Példa: CAlakzat alakz; //Hiba Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 3 / 11
Absztrakt osztályok használata Az absztrakt osztályokat felületként (interface) Az absztrakt osztályokat más osztályok bázisosztályaként Példa: class CPont double x,z; class CKor : public CAlakzat void Forgat(double) } ; void Rajzol(); CKor(CPont p, double r); private: CPont m_origo; double m_r; Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 4 / 11
Absztrakt osztályok használata Lehetséges az, hogy nem definiáljuk felül az összes tisztán virtuális függvényt A származtatott osztály is absztrakt osztály marad Lépcsőzetes osztály felépítésre add lehetőséget Példa: class CSokszog : public CAlakzat void Forgat(double) } ; // absztrakt osztály // Rajzol() függvény // nincsen felülírva CSokszog s; // hiba: az osztálynak // nem lehet példánya Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 5 / 11
Absztrakt osztályok használata Lehetséges az, hogy nem definiáljuk felül az összes tisztán virtuális függvényt A származtatott osztály is absztrakt osztály marad Lépcsőzetes osztály felépítésre add lehetőséget Példa: class CSokszog : public CAlakzat protected: list<cpont> m_pontok; void Forgat(double) ; void Rajzol() ; CSokszog s(pont1, pont2...); Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 6 / 11
Tervezés absztrakt osztályokkal A megvalósításolyan részletkérdés legyen, amelyről nem kell tudomást venniük azon felhasználóknak, akiket nem érdekel Az elkészített ősosztály lehetőleg ne tartalmazzon adatokat (Ha igen csak olyanokat, amit minden gyerekosztály haszálni fog.) Érdemes virtuális destruktort alkalmazni (Öröklő osztályok adatainak helyes "eltüntetése") Példa: (irányítástechnikai osztályok ) class CAlap protected: static double m_t; static double m_dt; double m_y; CAlap(double=0); virtual ~CAlap()} static double IdoIncr()return m_t+=m_dt;} static double GetIdo() return m_t;} virtual double Muvelet()=0; virtual void Atrak()} virtual void SetBem(CAlap *)} double GetJel() return m_y;} Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 7 / 11
Template létrehozása C++ Template (sablon) létrehozása Szintaxis: template<class C> class Osztaly_Neve template<class C> Sablon deklarációja következik C típusparamétert fogjuk használni Használata: Osztaly_Neve<char> tc; Osztaly_Neve<int> ti; Osztaly_Neve<Pont> tp; typedef Osztaly_Neve<char> RovidTipus; Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 8 / 11
Template létrehozása C++ Template (sablon) létrehozása Példa Verem kezelése template osztály segítségével TVerem a template osztály neve template<class C> class TVerem C* m_p; TVerem() ; TVerem(const TVerem&) ; Push(C) ; C Pop() ; TVerem<double> dverem; dverem.push(1.123); dverem.pop(); TVerem<int> iverem; Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 9 / 11
Template osztály C++ Template (sablon) létrehozása Használatával nem nővekedik a kód méréte Használatával nem nővekedik a futási idő Template osztály létrehozása előtt érdemes nem template osztályként letesztelni az osztályt Kódoslási és logikai hibák könnyebben detektálhatóak Egyszerűbb hibakeresés Tagjait ugyanúgy deklaráljuk és definiáljuk, mint a "közönséges" osztályok esetén Tagjai maguk is sablonok, paramétereik pedig ugyanazok, mint a sablon osztályéi. template<class C> C TVerem<C>::Pop() // return...; } template<class C> TVerem<C>::TVerem<C>() //.. } Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 10 / 11
Template paraméterek C++ Template (sablon) létrehozása Template osztálynak lehetnek függvényei Template osztály függvényeinek lehetnek paraméterei A paraméterek lehetnek Típust meghatározó template<class T, T def_val> class Cont /*... */ Sablon típusú paramétereik template<class C> C TVerem<C>::Pop() // return...; } template<class C> TVerem<C>::TVerem<C>() //.. } Fodor A. (Pannon Egyetem) Programozás 2010. április 8. 11 / 11