Útmutató az 5. laborhoz
Ezen a laborgyakorlaton a korábban C nyelven elkészített dinamikus String adatstruktúránkból és az azon műveletet végző függvényekből C++ osztályt hozunk létre. A C és C++ nyelvű változatok összehasonlításával jól felismerhetőek azok a mechanizmusok, amelyeket a C++ nyelv elrejt, illetve automatikusan biztosít (pl. this, alapértelmezett metódusok, kódelszigetelés).
A laborfoglalkozás végén töltse fel az elkészített string5.h és string5.cpp fájlokat a Jporta rendszerbe (String5, önellenőrző feladat), hogy megkapja a labor elvégzéséért járó pontot!
Felkészülés a laborra
- Ismételje át a 4. heti laborgyakorlat, valamint a 2. heti laborgyakorlat anyagát!
- Oldja meg a Cporta Cpp Vektor nevű feladatát!
- A laborgyakorlaton szüksége lehet a 2. laboron elkészített string2.cpp és sring2.h fájlokra. Ha feltöltötte a Jportara, akkor onnan ezek elérhetők.
Előkészítés (~10')
- Töltse le az előkészített projektet (https://git.ik.bme.hu/Prog2/labor_peldak/lab_05)!
- Mind a Visual C++, mind a CodeBlocks fejlesztőkörnyezethez elkészítettük a projektfájlokat (*.proj, *.cbp), illetve Makefile-t is készítettünk. Indítsa el megfelelő fejlesztőeszközt, és fordítsa le az előkészített programot!
- A C nyelven megvalósított String adatszerkezetet (string1) a 2. laboron a C++ nyelv nem OO eszközeivel átalakítottuk (string2_cpp). Vegye elő az akkor elkészített fájlokat (string2.cpp, string2.h), mert segíthet a további feladatok megoldásában! Most továbblépünk, a String adatszerkezetet igazi osztállyá alakítjuk:
- Az adatokon műveletet végző függvényeket összezárjuk az adatokkal, így ezek a függvények tagfüggvényekké válnak és
formálisan eltűnik az első paraméterük (s0) (ezt this-ként azért megkapják). - A nevük is megváltozik, mert most már az összetartozást, és a paraméterek típusára való utalást már nem a név hordozza, hanem az osztály.
- A createString... alakú függvényekből konstruktorok keletkeznek.
- A disposeString destruktorrá alakul át.
- Egyes műveletvégző függvényekből (pl. addString) operátor függvény lesz.
- Mivel dinamikusan tárolunk, biztosan nem felel meg néhány implicit deklarált tagfüggvény (másoló konstruktor, op=). Ezért ezeket felül kell definiálnunk.
- Az adatokon műveletet végző függvényeket összezárjuk az adatokkal, így ezek a függvények tagfüggvényekké válnak és
- Figyelmesen olvassa el a string5.h fájlban található megjegyzéseket, mert segítenek a feladat megoldásában!
A továbbiakban a deklarációkat és az inline függvényeket a string5.h állományba, míg a definíciókat a string5.cpp állományba írja!
Feladatok (~65')
Az string5.h fájlban definiált ELKESZULT makró felhasználásával lépésről lépésre haladva deklaráljon (string5.h) és implementáljon (string5.cpp) egy olyan sztring (String) osztályt C++ nyelven, ami dinamikusan tárol és rendelkezik az alábbi tulajdonságokkal!
- A paraméter nélkül hívható konstruktora üres sztringet hozzon létre! Van olyan tagfüggvénye ( size() ), ami visszaadja a szring hosszát.
- Van olyan tagfüggvénye ( c_str() ), ami C-sztringgel, azaz nullával lezárt karaktersorozatra mutató pointerrel (const char *) tér vissza.
- Van olyan konstruktora, ami karakterből hoz létre sztringet.
- Van olyan konstruktora, ami C-sztringből (const char*) hoz létre sztringet.
- Az osztályból létrehozott objektum legyen átadható értékparaméterként, azaz van jól működő másoló konstruktora! Különösen ügyeljen az üres sztring kezelésére, ha azt NULL pointerrel valósította meg!
- Támogassa a többszörös értékadást (b = a = a), azaz van jól működő értékadó operátora! Különösen ügyeljen az üres sztring kezelésére, ha azt NULL pointerrel valósította meg!
- Legyenek olyan operátorai (operator+), amivel a sztring végéhez sztringet, és karaktert lehet fűzni!
- Lehessen karakterhez is sztringet fűzni a + operátorral!
- A tárolt a karakterek legyenek elérhetőek a szokásos módon indexeléssel! Az indexeléssel elért elem legyen használható balértékként is! A konstans objektumok is legyenek indexelhetők. Az indexelés operátor hiba esetén dobjon const char * kivételt!
- Készítsen olyan inserter (<<) operátort, amivel egy sztring kiírható egy ostream típusú objektumra!
Szorgalmi feladatok:
- Készítsen olyan fűzhető extraktor (>>) operátort, amivel be tud olvasni egy szót egy sztringbe! A beolvasó működjön úgy, mint a scanf %s, azaz a szó végét white space határolja! A szó eleji white space karaktereket pedig el kell dobni.
- Próbálja ki ékezetes szövegekkel is az elkészített String osztályt! Segítségül elkészítettünk egy egyszerű kódrészletet ami szavakat olvas be, majd qsort() függvénnyel rendezi azokat. Az ékezetes karakterek kódolásával kapcsolatban korábban már volt egy egyszerű szorgalmi feladat. Most a rendezésen van a hangsúly. Értse meg a rendez.cpp fájlban levő kód működését és futtassa a programot! A magyar ékezetes karakterek Windows alatt akkor jelennek meg helyesen ha a konzol ablakban Lucida Console betűkészlet van kiválasztva és a nyelvi környezet magyar!
- A setlocale függvényhívás beállítja a karakterek és sztringek összehasonlításához szükséges nyelvi környezetet (LC_COLLATE) próbálja ki! Változott a rendezési sorrend?
Az string2_test.cpp állományban magyar ékezetes szövegeket is használtunk. A különféle karakterkódolások miatt sajnos nem magától értetődő, hogy hogyan kell konzolos C/C++ programból ékezetes szövegeket megjeleníteni.
Jó munkát!
Szeberényi Imre