Programozás C++ osztályok
Fodor Attila Pannon Egyetem Műszaki Informatikai Kar Villamosmérnöki és Információs Rendszerek Tanszék
[email protected]
2010. április 8.
C++
Absztrakt (elvont) osztályok
Absztrakt (elvont) osztályok 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 { public: 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
C++
Absztrakt (elvont) osztályok
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 { public: 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;
Fodor A. (Pannon Egyetem)
//Hiba
Programozás
2010. április 8.
3 / 11
C++
Absztrakt (elvont) osztályok
Absztrakt (elvont) osztályok 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 { public: 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
C++
Absztrakt (elvont) osztályok
Absztrakt (elvont) osztályok 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 { public: void Forgat(double) { } ;
// absztrakt osztály
// Rajzol() függvény // nincsen felülírva // ... }; CSokszog s;
Fodor A. (Pannon Egyetem)
// hiba: az osztálynak // nem lehet példánya
Programozás
2010. április 8.
5 / 11
C++
Absztrakt (elvont) osztályok
Absztrakt (elvont) osztályok 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
m_pontok; public: void Forgat(double) ; void Rajzol() ; // ... }; CSokszog s(pont1, pont2...);
Fodor A. (Pannon Egyetem)
Programozás
2010. április 8.
6 / 11
C++
Absztrakt (elvont) osztályok
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; public: 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
C++
Template (sablon) létrehozása
Template létrehozása Szintaxis: template class Osztaly_Neve { // ... };
template Sablon deklarációja következik C típusparamétert fogjuk használni
Használata: Osztaly_Neve tc; Osztaly_Neve ti; Osztaly_Neve tp; typedef Osztaly_Neve RovidTipus;
Fodor A. (Pannon Egyetem)
Programozás
2010. április 8.
8 / 11
C++
Template (sablon) létrehozása
Template létrehozása Példa Verem kezelése template osztály segítségével TVerem a template osztály neve template class TVerem { C* m_p; public: TVerem() ; TVerem(const TVerem&) ; Push(C) ; C Pop() ; // ... };
TVerem<double> dVerem; dVerem.Push(1.123); dVerem.Pop(); TVerem iVerem;
Fodor A. (Pannon Egyetem)
Programozás
2010. április 8.
9 / 11
C++
Template (sablon) létrehozása
Template osztály 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 C TVerem::Pop() { // ... // return ...; } template TVerem::TVerem() { //.. } Fodor A. (Pannon Egyetem)
Programozás
2010. április 8.
10 / 11
C++
Template (sablon) létrehozása
Template paraméterek 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 Cont { /* ... */ };
Sablon típusú paramétereik template C TVerem::Pop() { // ... // return ...; } template TVerem::TVerem() { //.. }
Fodor A. (Pannon Egyetem)
Programozás
2010. április 8.
11 / 11