NagyHF
Már mindent tudunk, hogy meg tudjuk tervezni, és elkezdjük a megvalósítást is. Itt az idő!File I/O.
Sokaknak szüksége lehet file-kezelésre a nagyházi elkészítésekor. Egy kódrészletekkel fűszerezett remek kis összefoglalót ad a C++.com.Órai feladat
A 10. aut-os konzervből indulunk. Javítsuk a tesztelő hibáját: nem csak iostream kell, hanem cstdio is a printf miatt. Valósítsuk meg a tesztelő helyes működéséhez szükséges tagfüggvényeket egy megfelelő nevű .cpp file-ban. (Vigyázz, a headerben egy csomó felesleges tagfüggvény is deklarálva van, nem kell mindhez definíció!) Alapból kötelező az operator=, copy ctor (most nem is fog hívódni), dtor. Kivételesen — aconst char*
típuskonverziós operátor egyszerű megvalósíthatósága érdekében — alkalmazzunk redundáns tárolást. A két héttel ezelőtti string osztálytól eltérően, most a lezáró '\0' karaktert is tároljuk! Mindezt azért tesszük, mert így egyszerűen pData-t visszaadva megvalósítható a type cast. A megválaszolandó kérdések:
- A tesztelő egyes sorainak végrehajtása során mely függvények hívódnak? (töréspont minden függvénybe, aztán figyelni, megmagyarázni.)
-
Az if utasításban szereplő összehasonlítás miért nem fordul le explicit típuskonverzió nélkül (
str1=="szoveg"
)? Értelmezzük a compiler üzenetét! És ha nem lenne mindkét irányba típuskonverziónk? Próbáljuk ki!
10. Házi feladat.
Készítsünk egy adattaggal nem rendelkező ősosztályt (os), mely kötelezően előírja egyint cmp(const os&)const
szabályos összehasonlító függvény (*), valamint egy void print()const
kiíró megvalósítását valamennyi leszármazott számára. (Absztrakt, tisztán virtuális.) Gondoljuk át a destruktor dolgát is.Származtassunk belőle különböző minimalista osztályokat (értsd: csak a fent specifikált, valamint a helyes működéshez elengedhetetlen tagfüggvényekkel), legalább: komplex (kplx) és szöveg (szo). Valósítsunk meg mindent, ami a helyes működéshez szükséges. Kivételesen a szövegnél a rendezési elv lehet a tárolt szöveg hossza. Komplexnél pl. az abszolút érték.
(*)Szabályos hasonlító függvény visszatérési értéke negatív, ha az első paraméter megelőzi a másodikat, zérus, ha a két paraméter azonos a sorbarendezés szempontjából, végül pozitív, ha első követi a másodikat egy megadott rendezési elv szerint.
1. feladat
-
A cmp megvalósításában szükség van megfelelő típuskonverzióra, pl.:
(const kplx&)param
, mivel ősosztály referenciát veszünk át. (nem kell operátort írnunk, hisz csak referenciát type castolunk.) A print esetén nincs ilyen probléma, hisz nincs további paramétere. - A kipróbáló modulban készítsünk néhány kplx és néhány szo objektumot, majd próbáljuk ki az értelmes összehasonlításokat.
- A kipróbáló modulban az érdemi részt zárjuk egy try blokkba, és helyezzünk mögé megfelelő mintákkal két catch blokkot. (exception&, ...) A tesztelés során próbáljunk ki néhány hibás hasonlítást kplx és szo, ill. szo es kplx között. Mi történt? Sikerült-e elkapni kivételt?
- A fenti kérdésre a választ a tesztelőben elhelyezett kommentben várom.
2. feladat
-
Az előző forrásból kiindulva, a cmp megvalósításában cseréljük a hagyományos konverziót megfelelő C++-os típuskonverzióra, pl.:
dynamic_cast<const kplx&>(param)
. A dynamic_cast képes rá, hogy futásidőben ellenőrizze a konverzió helyességét, hiba eseténstd::bad_cast
kivételt dob. - A kipróbáló modul objektumai maradnak, próbáljuk ki az értelmes összehasonlításokat.
- Helyezzünk el egy megfelelő harmadik catch blokkot az előzőek elé. Figyeljük a hibás hasonlításokat. Mi történt? Sikerült-e elkapni kivételt? Melyik blokkban?
- A fenti kérdésre a választ a tesztelőben elhelyezett kommentben várom.
Beadandó a fentiek szerint két könyvtárba rendezett két megoldás egy zip-ben. include "../_foot.inc"; ?>