(H) Kirjaston kirja

Tavoite: Opin toteuttamaan pienen luokan C++:lla ja käyttämään luokan attribuuttina toisen luokan ilmentymää (oliota).

Ohjeita: Hae ohjelmakoodipohja: templates/03/simple_library/ -> student/03/simple_library/.

Valmiissa ohjelmassa tulee olla kaksi yksinkertaista luokkaa: Date ja Book. Näistä ensimmäinen kuvaa päivämäärää, ja se on toteutettu valmiiksi. Kullakin päivämäärällä on kolme lukuarvoa: päivä, kuukausi ja vuosi. Kun päivämääräolio luodaan, näille luvuille asetetaan arvot. Päivämäärä voidaan tulostaa muodossa pp.kk.vvvv. Päivämäärää voidaan siirtää eteenpäin metodilla advance. Luokassa Date on myös yksityinen metodi is_leap_year, joka kertoo, onko kyseisen päivämäärän vuosi karkausvuosi vai ei. Tätä metodia tarvitaan, kun päivämäärää siirretään eteenpäin. Sitä ei kuitenkaan ole tarkoitettu käytettäväksi luokan ulkopuolelta, ja siksi se on esitelty private-osassa.

Toteutettavaksesi jää luokka Book, joka kuvaa kirjaston kirjaa. Kustakin kirjasta tiedetään nimi ja kirjoittaja sekä se, onko kirja lainassa vai ei. Jos kirja on lainassa, siitä tiedetään myös lainauspäivämäärä ja palautuspäivämäärä (eräpäivä).

Kirja voidaan lainata (ellei se jo ennestään ole lainassa), se voidaan myös uusia (jos se on aikaisemmin lainattu) sekä palauttaa. Jos lainaaminen onnistuu, lainausmetodi luo kirjalle lainauspäivämäärän (annetaan parametrina) sekä eräpäivän, joka on 28 vuorokautta lainauspäivämäärästä eteenpäin. Jos uusiminen onnistuu, uusimismetodi siirtää eräpäivää 28 vuorokautta eteenpäin. (Huomaa, että tässä uusiminen toimii eri tavalla kuin oikeassa kirjastossa. Oikean kirjaston uusinnassa uusi eräpäivä lasketaan uusimispäivästä eteenpäin, mutta tässä se lasketaan vanhasta eräpäivästä.)

Lisäksi kirjan tiedot voidaan tulostaa muodossa tekijä : nimi. Jos kirja ei ole lainassa, tulostusmetodi tulostaa tekstin available. Jos kirja on lainassa, tulostusmetodi tulostaa, milloin kirja on lainattu ja milloin se pitää palauttaa. Tarkempi tulostusasu näkyy alla olevassa esimerkissä.

Koodipohjassa on mukana pääohjelma (tiedostossa main.cpp). Sieltä näkyy, miten luokan Book metodeja on kutsuttu. Toteuta luokka Book, joka sisältää tiedot yksittäisestä kirjasta, ja kaikki metodit, joita pääohjelmassa kutsutaan. Pääohjelmassa esiintyy vain yksi kirjaolio, mutta niitä voisi olla useampikin.

Luokkaa Date ei ole tarpeen muuttaa, mutta tarvitset sitä Book-luokan toteuttamisessa. Lisäksi siitä voi katsoa mallia, miltä luokan otsikko- ja toteutustiedostot näyttävät.

Kun luokka Book on toteutettu, ohjelma toimii annetulla pääohjelmalla seuraavasti:

Kivi : Seitseman veljesta
- available
Already loaned: cannot be loaned
Kivi : Seitseman veljesta
- loaned: 05.05.2020
- to be returned: 02.06.2020
Kivi : Seitseman veljesta
- loaned: 05.05.2020
- to be returned: 30.06.2020
Not loaned: cannot be renewed
Kivi : Seitseman veljesta
- available
Kivi : Seitseman veljesta
- loaned: 19.05.2020
- to be returned: 16.06.2020

Vinkkejä tehtävän tekemiseen:

  • Muista luoda uudet tiedostot Qt Creatorissa valitsemalla “New File or Project” -toiminnolla avautuvasta ikkunasta “C++” ja “C++ Class”. Tällöin Qt Creator huolehtii automaattisesti siitä, että projektia käännettäessä tiedostot tulevat käännökseen mukaan oikealla tavalla.
  • Kun olet kirjoittanut metodin esittelyn tiedostoon book.hh, testaa myös toimintoa “Refactor” -> “Add Definition in book.cpp”. Löydät tämän klikkaamalla metodin esittelyä hiiren oikeanpuoleisella näppäimellä.
  • Ohjelma ei käänny, kun funktiossa main on kutsuja metodeille, joita ei ole vielä määritelty. Jos haluat koodata ohjelmasi fiksusti osissa toteutat ensin luokkarajapinnasta nk. stubin, jossa on vain tyhjät metodien määrittelyt mahdollisesti tarvittavien return-käskyjen kera. Tämän jälkeen suoritat tietenkin commitin versionhallintaan (luokkarajapinnan stub valmis).
  • Tehtävässä käytetään yksikkötestejä, mikä tarkoittaa, että jokaisen metodin pitää erikseen toimia oikein. Ei siis riitä, että ohjelma kokonaisuudessaan toimii oikein eli tulostaa oikeat tulostukset. Tarkemmin sanottuna print-metodi hoitaa varsinaisen tulostuksen. Muut metodit hoitavan nimensä mukaisen toiminnon ja tulostavat virheilmoituksen, jos toiminto ei ole mahdollinen.
  • Valmiiden luokkien metodeitten toteutuksia ei välttämättä tarvitse ymmärtää. Ei esimerkiksi haittaa, vaikka et ymmärtäisi Date-luokan advance-metodin tai toisen rakentajan toteuksia.

A+ esittää tässä kohdassa tehtävän palautuslomakkeen.