150 likes | 245 Views
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. december. C++ programozási nyelv Gyakorlat - 12. hét. Tartalomjegyzék. Kivételek használata Paraméterátadás - Visszajelzés A külvilággal való kapcsolat Saját programhiba jelzése
E N D
Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet Soós Sándor 2004. december C++ programozási nyelvGyakorlat - 12. hét
Tartalomjegyzék • Kivételek használata • Paraméterátadás - Visszajelzés • A külvilággal való kapcsolat • Saját programhiba jelzése • Külső program hibáinak kontrollálása • Külső adatok hibáinak kivédése • Mi írunk egy függvényt, amit valaki más fog használni • Kivételek használata speciális esetekre • Csomagoló, wrapper függvények • Konstruktorok fajtái,értékadó operátor • A this pointer • Mikor hívódnak meg? • Automatikusan létrehozott konstruktorok, ill. operator=
Kivételek használata • A múlt órán megtanultuk a kivételkezelés technikáját. • Hogyan kell használni a kivételkezelést • Most arról lesz szó, hogy mire használhatjuk ezt az eszközt, a kivételkezelést. • Erre fogunk látni különböző példákat
Paraméterátadás - Visszajelzés • A paraméterátadásról sokat szoktunk beszélni, a visszafelé irányú kommunikációról viszont szinte egyáltalán nem. Pedig nagyon fontos dolog. Vissza kell jelezni a sikeres, vagy a sikertelen eredményt is. • A hívott függvény visszaadhat információt: • visszatérési értékként • cím szerint átadott paraméterekben • esetleg globális változóban • Az eddigi három esetben a programozó gondosságán múlik, hogy figyel-e a visszajelzésre • kivétel kiváltásával • Ha a programozó nem kezeli le a hibát, akkor véget ér a program. • Alaposan meg kell tervezni a visszajelzések rendszerét, éppen úgy, mint a paraméterek átadását!
A külvilággal való kapcsolat • Milyen módokon kerülhetünk kapcsolatba a külvilággal? • Külső függvény meghívása • Adatok beolvasása • Az én függvényemet fogják meghívni kívülről • Mindhárom esetben fel kell készülni a lehetséges hibákra.
Saját programhiba jelzése int main() { try{ f(3); } catch(ProgramHiba& p){ printf("Programhiba %d\n",p.Kod); } catch(...){ printf("Egyeb kivetel\n"); } return 0; } // except_alk0.cpp class ProgramHiba{ public: ProgramHiba(int K) { Kod = K; } int Kod; }; void f(int Par) { switch(Par){ case 1: printf("Csinalunk valamit\n"); break; case 2: printf("Itt is\n"); break; default: // programhiba throw ProgramHiba(-1234); break; } } Felkészülünk a hibás paraméter értékekre
Külső program hibáinak kontrollálása // except_alk1.cpp void MasEmberFuggvenye() { int x,y; x = 0; y = 1 / x; } void main() { try{ MasEmberFuggvenye(); } catch(...){ // minden kivételt elkapunk printf("Ejnye, MasEmber.\n"); } }
Külső adatok hibáinak kivédése • Kivételkezelés nélkül • Lásd except_alk2.cpp • Kivételkezeléssel • Lásd except_alk3.cpp
Mi írunk egy függvényt, amit valaki más fog használni • Nem lehetünk biztosak abban, hogy a függvényünk hívója figyelni fog a visszaadott értékre. • Kivétel kiváltásával kikényszeríthetjük a hibával való foglalkozást, különben véget ér a program. • Lásd except_alk4a.cpp ! • Ha egy függvényt valaki úgy írt meg, hogy nem kezeli le a hibákat, és mi nem módosíthatjuk a szignatúráját, akkor kivételek kiváltásával oldhatjuk meg a problémát. • Lásd except_alk4b.cpp ! • Az is hasznos lehet, ha felhasználjuk a visszatérési értéket és a kivételeket egyaránt. Pl. kis hiba – return; nagy hiba – kivétel • Lásd except_alk4c.cpp ! • Ne felejtsük el, hogy a kivételkezelést is tesztelni kell, ehhez szimulálhatjuk a hibás eseteket!
Kivételek használata speciális esetekre • Nem csak hibák kezelésére használhatjuk a kivételeket. • Bizonyos eseteket kezelhetünk kivételként. • Lásd except_alk5.cpp ! • A kivételben tetszőleges információkat is átadhatunk, akár többféle adatot is. • Lásd except_alk6.cpp !
Csomagoló, wrapper függvények • Egy külső függvényt becsomagolhatunk úgy, hogy módosítjuk a függvény hibakezelését. A függvény hibajelzéseit átalakíthatjuk • visszaadott hibakódokra • Lásd except_alk7a.cpp ! • kivételekre • Lásd except_alk7b.cpp !
Konstruktorok fajtái,értékadó operátor • Default konstruktor • Paraméteres konstruktor • Másoló konstruktor • Valami( Valami& Masik ); • Értékadó operátor • Valami& operator=( Valami& Masik );
A this pointer • Minden osztály minden metódusa kap egy láthatatlan paramétert, ami az éppen aktuális példányra mutató pointer, a neve "this". • Ritkán használjuk, mert a this elhagyásával is hozzáférhetünk az aktuális objektum tagjaihoz. • Néha azonban szükség van rá, például névazonosság esetén class Valami { public: int X; Valami( int X ) { this->X = X; } } Ebben az esetben persze elkerülhető a this használata, ha átnevezzük az egyik X -et.
Mikor hívódnak meg? • Mikor hívódnak meg az egyes konstruktorok illetve az operator= ? int main() { Valami v1; Valami v2(v1); Valami* vp = new Valami(v1); v2 = v1; Valami v3 = v1; } • Lásd konstr1.cpp !
Automatikusan létrehozott konstruktorok, ill. operator= • Mikor elégedhetünk meg az automatikusan generált változatokkal? • Mikor kell sajátot írnunk? • Hogyan tilthatjuk meg a generálást? Miért? • Mi történik egy tagobjektummal, ha kifelejtjük a másoló konstruktorból?