Kihagyás

Órai feladat

6. Gyakorlat

Az űrlények felfedezték, hogy a halfogyasztás jót tesz a bőrüknek. Emiatt a tehenek mellett most már kifejezetten pontyokat is szeretnének rabolni. Az elrabló modulok teljes felújítása vált szükségessé: segíts létrehozni az újfajta reprezentációt, mely a jövőben bármilyen állat elrablására képessé teszi az űrhajókat!

motto


Nulladik feladat!

A feladatok megoldása előtt töltsük le a kiindulási kódunkat, ezt kiegészítve fogunk dolgozni!

Kiindulási kód

kiindulo.cpp


  1. Refaktoráljuk a kiindulási kódot! A Tehen és a Juhaszkutya osztályok egymáshoz hasonlónak tekinthetőek. Mindkettő állatot ábrázol, mindkettőnek van private nev adattagja és mindkét osztályban szeretnénk elhelyezni egy hangotAd() függvényt, amelynek szignatúrája azonos, de más a belső működése a két osztályban.
    • Mi a hasonlóságok kezelésére a bevett objektum orientált módszer?
  2. Hozzuk létre az Allat ősosztáyt és végezzük el a szükséges módosításokat, hogy a Tehen és a Juhaszkutya is a gyerekosztálya legyen!
    • Szervezzük ki a nev adattagokat az ősosztályba! Hozzunk létre neki gettert, szettert és egy sztring paraméteres konstruktort is a beállításhoz!
      • Muszáj kitörölni a gyerek osztályok nev adattagját? Miért?
      • Mi most töröljük a gyerekek nev adattagjait!
    • Próbáljuk lefordítani a kódot!
      • Használjunk protected láthatóságot!
      • Kezeljük a gyerekosztályok konstruktorait!
        • A Juhászkutyaoszályban default konstruktor legyen, ami a nevet "Bodri"-ra állítja!
        • A Tehén osztályban maradjon az eddigi paraméteres konstruktor, de inicializáljuk a megfelelő módon az ősosztályban levő adattagot!
  3. Hozzunk létre egy hangotAd konstans metódust az Allat ősosztályban. A függvény feladata, hogy visszaadja ezt a sztringet: "Hangot ad:"!
    • Definiáljuk felül a viselkedést a gyerekekben!
      • Tehen esetén: "Hangot ad:muu"
      • Juhaszkutya esetén: "Hangot ad:vau"
    • Hogy lehet egyszerűsíteni a kódon, hogy ne kelljen mindig beírni a "Hangot ad:" prefixet?
  4. Bővítsük a Cseszalj osztályunkat! Készítsünk egy vizsgal(Allat a) publikus metódust, mely az elrablásra szánt állatot várja paraméterül! True-t ad vissza, ha az állat elrabolható, azaz tehén, és hamisat, ha nem (minden más). A vizsgálat a hangotAd által visszaadott sztring alapján történjen!
    • Ha a visszaadott sztring "muu"-ra végződik, az elrablás lehetséges!
    • Ha a visszaadott sztring rövidebb, mint három karakter (rövidebb mint "muu"), legyen std::runtime_error("tul rovid") kivétel dobva!
    • Hívjuk meg a main-ben a vizsgal metódust tehénre és kutyára is! Mi a tapasztalat?
    • Írassuk ki a hangotAd() által visszaadott értéket a vizsgal() függvényen belül!
  5. Bővítsük a Cseszealj osztályt egy vizsgalRef(const Allat& a) metódussal, ami konstans állat referenciát vár! Implementációja egyezzen a vizsgal() metóduséval! Próbáljuk ki a használatát!
  6. Tegyük virtuálissá a hangotAd függvényt az ősosztályban! Futtassuk le a vizsgal() és vizsgalRef() metódusokat!
  7. Próbáljuk ki, hogy kitörljük a const-ot a Juhaszkutya hangotAd() metódusáról! Futtassuk le így is a vizsgalRef metódust! Mit tapasztalunk?
    • Alkalmazzuk az override módosítót a hangotAd felüldefiniálásokra!
  8. Írjunk egy saját kivétel osztályt! Neve legyen OsAllatKivetel és öröklődjön publikusan az std::exception osztályból!
  9. Definiáljuk felül az std::exception ősosztály const char* what() const noexcept metódusát! Legyen a visszaadott szöveg: "Hiba: ős állat vizsgálata!"!
  10. Dobjunk OsAllatKivetel típusú kivételt a vizsgalRef metódusban, ha a paraméterben kapott objektum az ős Allat osztály sztringjét adja vissza ("Hangot ad:")!
  11. Teszteljük a vizsgalRef függvényt ős Allat objektum átadásával! Kapjuk el a kivételt a main függvényben try-catch blokk segítségével!
    • Kapjuk el érték szerint, és írassuk ki a cout-ra a what metódus által visszaadott értéket!
    • Kapjuk el érték szerint, DE ős (std::exception) típusként! Írassuk ki cout-ra a what metódus által visszaadott értéket!
    • Módosítsuk a típust const std::exception&-re (konstans referencia legyen) és így is teszteljük!
  12. Írjunk egy Ponty osztályt, ami az Allat ősosztályból öröklődik és a hangotAd függvénye üres sztringet ad vissza, hiszen a halak nem beszélnek (legalábbis nem halljuk őket). Minden ponty neve "Nemo" legyen, úgysem tudnánk megkülönböztetni őket! Teszteljük ezzel is a vizsgalRef függvényt!
    • Hogyan lehetne a try-catch blokkban a runtime_exception-t külön kezelni, mint a többi exception-t?
  13. Hogyan lehetne elérni, hogy az általános Allat osztályból ne tudjunk példányt létrehozni? Implementáljuk is le!

Elakadtál, nem tudtad követni az órát?! Vagy csak átismételnéd? Egy lehetséges megoldását a feladatoknak megmutatjuk!

Órai feladat megoldása

megoldas.cpp



Utolsó frissítés: 2024-10-26
Létrehozva: 2024-07-23