Órai feladat
A kivételkezeléssel ismerkedtünk meg, a 12. aut-os konzerv alapján. Kövessük a megjegyzések útmutatását, és értsük meg a működést!Figyelem a kiadott anyagtól eltérően, az üres throw specifier throw()
azt jelenti, hogy a kérdéses függvény semmilyen kivételt nem dobhat.
Íme a kivételek ősosztálya:
class exception { public: exception () throw(); exception (const exception&) throw(); exception& operator= (const exception&) throw(); virtual ~exception() throw(); virtual const char* what() const throw(); }Ennek megfelelően a leszármazott saját kivételosztályban sem dobhat kivételt sem
dtor
, sem what()
. (Ezt azonban nem ellenőrzi a compiler...)
Igen sok "gyári" kivételosztály létezik a szabványos könyvtárban, használjuk bátran azokat.(Használatukhoz az stdexcept headert kell include-olni.)
9. Házi feladat.
Jövő héten kisZH lesz.Vegyük elő az 5. heti racionális osztályunkat. (Ha nincs ilyenünk, esetleg megfelelő az órán elkészített komplex is.)
Készítsünk intelligens dinamikus tömböt, melynek elemei racionális számok legyenek. Írjunk saját kivételosztályt (
tomb_hiba
) az
exception osztályból származtatva. Legyen ErrCode, Reason és what(). A hibás tömbműveleteket kivételekkel kezeljük. (Maga a tömb, és kezelése nagyon hasonló a stringhez vagy a stackhez.)
- A racionális osztályhoz (Rac) nem kell hozzányúlnunk, ha már eleve const a Print() függvénye, csak emeljük be a projectbe. Ha nem így lenne, tegyük azzá.
- Vegyük észre, hogy a reciprokképző operátor problémáját is megoldaná egy if() throw...., de NEM kell módosítani.
- A tároló osztály készítésekor általános elv: ahol lehet, legyen const, referencia.
- Kívülről hozzáférhetetlen tagváltozók: a tömb mérete, és a dinamikus memória címe.
- Inicializáláskor a tömböt az alábbi módokon lehessen megadni: üres tömb (default), egy már létező tömb alapján (másoló).
- Legyen kiíró tagfüggvény [Print()], mely a szabványos kimenetre listázza a tömb elemeit. (Ehhez természetesen használjuk fel a racionális osztály kiíróját!)
-
Legyen
void berak(Rac mit,int hova)
tagfüggvény, mely a hova pozícióba beszúrja mit egy új elemként, tehát bővíti a tömböt. Ha hova negatív, dobjontomb_hiba
kivételt. Ha hova nagyobb, mint az utolsó tömbelem indexe, akkor úgy bővítse a tömböt, hogy éppen beférjen az új elem utolsóként. (Ilyenkor a bővített rész elemei 0 (0/1) értéket vegyenek fel.) Lehessen egy paraméterrel is hívni a berak függvényt, ilyenkor az új elemet a meglévő tömb végére kell beszúrni. -
Legyen
Rac kivesz(int honnan)
, amely ténylegesen eltávolítja a kért elemet a tömbből, majd visszatér a megadott indexű elem értékével. Ha a létező tömbön kívülre hivatkozunk, dobjontomb_hiba
kivételt. Lehessen paraméter nélkül is hívni a kivesz függvényt, ilyenkor a meglévő tömb utolsó elemét kell eltávolítani. - Készítsünk a szokásos módon működő = == és != operátorokat tömb objektumokra. ([1,2,3]!=[1,3,2])
-
Nézzünk utána neten (pl. cplusplus.com) a szabványos
out_of_range
kivételnek. Valósítsuk meg az indexelő [] operátorokat (ügyeljünk, melyik mivel tér vissza), melyek figyelnek az index helyes értékére, hibás híváskor dobjanak (std::)out_of_range
kivételt. Az index helyes értékű: 0 ≤ idx < méret esetén. -
Készítsünk
Rac osszeg()
tagfüggvényt, mely a tömb elemeinek az összegét adja vissza. (Használjuk a Rac osztályunk + vagy += operátorát.) -
A fenti függvények csak kivételt dobnak, de nincs sem try, sem catch blokkjuk.
A kipróbáló modulban az érdemi részt zárjuk egy try blokkba, és helyezzünk mögé megfelelő mintákkal min. három catch blokkot. Kommentezzük, hogy az adott rész mely kivételeket kapja el.
A tesztelés során próbáljunk ki minden lehetséges függvényt és kivételt. A hibát (kivételt) okozó sorhoz fűzzünk magyarázatot, majd a sort kommentezzük ki, de maradjon benne a kódban.
pl.
// t[-2]=3; // balérték [] operátor tesztelése negatívval
// t[23].print(); // jobbérték [] operátor tesztelése, túl nagy az index - A program tagolása a szokásos.
Beadandó a felhasznált Rac osztály, és a fentiek szerint elkészített 3 forrásfile egy zip-ben. include "../_foot.inc"; ?>