Evtek TM03S Hannu Laine C++-ohjelmointi Kevät 2006 Tehtävä 4. (Dynaaminen datajäsen ja konstruktorien ja destruktorien merkitys) Vaihe 1. Kirjoita luokka Person, jolla on kolme datajäsentä: nimi, lasten lukumäärä ja lasten iät. Nyt oletetaan, että lasten maksimilukumäärä on 5.Ensimmäisessä vaiheessa käytetään "staattista" taulukkoa lasten ikien tallentamiseen jolloin sen määrittely luokan sisällä on muotoa int ages[5]. Vaiheessa 1 luokalle tehdään seuraavat jäsenfunktiot: konstruktori, jolle annetaan henkilön nimi, lasten lukumäärä ja lasten iät parametrina. funktio list, joka tulostaa henkilön kaikki tiedot Kirjoita lisäksi globaali (ei jäsenfunktio vaan tavallinen) funktio f, jolle annetaan parametrina henkilö, ja joka nyt sekin vain tulostaa parametrina saamansa henkilön tiedot ruutuun käyttäen jäsenfunktiota list. Funktion f prototyyppi on siis void f(Person p); Testaa luokka Person seuraavalla pääohjelmalla void main(void) { Person p("Matti", 3, 10, 12, 16); //Kolme lasta p.list(); f(p); p.list(); } Totea, että kaikki toimii oikein. Vaihe 2. Muuta luokan määrittelyä siten, että käytetään dynaamista taulukkoa lasten ikien tallentamiseen. Jotta dynaaminen muisti tulisi asianmukaisesti vapautettua, kirjoita tässä vaiheessa myös luokan destruktori. Kirjoita destruktorifunktioon myös tulostus "destruktori suoritettu", jotta saat kuvan milloin ja montako kertaa se suoritetaan. Käytä edelleen täsmälleen samaa main-funktiota testaukseen ja aja ohjelma. Huomaat, että ohjelma kaatuu tai antaa vääriä tuloksia. Selvitä itsellesi, mistä tämä ongelma johtuu. Ongelma voidaan korjata kahdella tavalla (katso vaiheet 3 ja 4). Vaihe 3. Korjaa ongelma käyttämällä arvoparametrin sijaan viittausparametria funktiossa f. Miksi se korjaa ongelman? Vaihe 4. Muuta parametri takaisin arvoparametriksi ja korjaa ongelma toisella tavalla eli tekemällä luokalle asianmukainen kopiokonstruktori. Miksi se korjaa ongelman.