## 2 Auto-Henkilo -assosiaatio **Tehtävä:** Tässä tehtävässä on valmiiksi kirjoitettu luokka Auto, joka sisältää kaksi jäsenmuuttujaa. Ensimmäinen on string-tyypin muuttuja merkki_, joka kuvaa auton merkkiä. Toinen muuttujista on ajetut_km_, joka kuvaa autolla ajettujen kilometrien määrää. Edellisten lisäksi Auto-luokassa on: - Parametrillinen muodostin, joka välittää muodostettavalle auto-oliolle merkin ja ajettujen kilometrien määrän annetussa järjestyksessä. - Funktio Liiku, joka ottaa vastaa kokonaislukutyypin arvon, jolla imaistaan liikuttavien kilometrien määrää. Funktio lisää vastaanotetun arvon muuttujaan ajetut_km_ ja tulostaa esimerkkitulosteen mukaisen tekstin näytölle. - Funktio KerroAjetutKm, joka sitä kutsuttaessa tulostaa autolla ajettujen kilometrien määrän. Sinun tehtävänäsi on muodostaa Henkilo-luokka, jolla on osoittimen avulla toteutettu assosiaatiosuhde Auto-luokkaan. Henkilo-luokka tarvitsee kaksi jäsenmuuttujaa: henkilön nimen (string) ja osoittimen Auto-luokan olioihin. Edellisten jäsenmuuttujien lisäksi Henkilo-luokkaan pitää määritellä ja toteuttaa seuraavat palvelut: - Parametrillinen muodostin, joka muodostaa uuden henkilön ja sijoittaa olion jäsenmuuttujiin parametrina saadut nimen ja osoittimen tiettyyn auto-olioon. - Funktio AjaAutoa, joka saa kokonaislukutyypin parametrin, jolla ilmaistaan ajettavien kilometrien määrän. AjaAutoa-funktion tehtävänä on kutsua Auto-luokan Liiku funktiota, jolle ajettavien kilometrien lukumäärä välitetään. - Funktio VaihdaAutoa, joka saa parametrina osoittimen uuteen auto-olioon ja jonka funktio vaihtaa entisen auton tilalle. Huomaa, että vanhaa auto ei tarvitse, eikä pidä tuhota. Pääohjelma, jossa vastaustasi testataan, muodostaa kaksi autoa ja yhden henkilön. Henkilö ajaa ensin toista autoa, vaihtaa autoa ja ajaa uudella autolla. Lisäksi auto-oliota pyydetään tulostamaan ajettuja kilometrejä luokkien välisen assosiaation toimimisen toteamiseksi. Example output: ``` Toyota Corolla DX merkkisellä autolla on ajettu 25000 km Wrooom...1000 kilometriä ajettu. Toyota Corolla DX merkkisellä autolla on ajettu 26000 km Ferrari F50 merkkisellä autolla on ajettu 1500 km Wrooom...20000 kilometriä ajettu. Ferrari F50 merkkisellä autolla on ajettu 21500 km ``` **Vastaus:** ``` //** Pre-defined code in the assignment **// #include using namespace std; class Auto { public: void Liiku(int km); void KerroAjetutKm(); Auto(string merkki, int ajetut_km); private: string merkki_; int ajetut_km_; }; Auto::Auto(string merkki, int ajetut_km) : merkki_(merkki), ajetut_km_(ajetut_km) { } void Auto::Liiku(int km) { ajetut_km_ = ajetut_km_ + km; cout << "Wrooom..." << km << " kilometriä ajettu." << endl; } void Auto::KerroAjetutKm() { cout << merkki_ << " merkkisellä autolla on ajettu " << ajetut_km_ << " km" << endl; } //** ---------- ---------- ---------- **// class Henkilo { public: Henkilo(string nimi, Auto* car); void AjaAutoa(int km); void VaihdaAutoa(Auto* car); private: string nimi_; Auto* car_; }; Henkilo::Henkilo(string nimi, Auto* car) : nimi_(nimi), car_(car) { Auto* car_ = car; nimi_ = nimi; } void Henkilo::AjaAutoa(int km) { car_->Liiku(km); } void Henkilo::VaihdaAutoa(Auto* car) { car_ = car; } //** Pre-defined code in the assignment **// int main() { Auto* deksteri = new Auto("Toyota Corolla DX", 25000); Auto* ferrari = new Auto("Ferrari F50", 1500); Henkilo* autoilija = new Henkilo("James", deksteri); deksteri->KerroAjetutKm(); autoilija->AjaAutoa(1000); deksteri->KerroAjetutKm(); ferrari->KerroAjetutKm(); autoilija->VaihdaAutoa(ferrari); autoilija->AjaAutoa(20000); ferrari->KerroAjetutKm(); return 0; } //** ---------- ---------- ---------- **// ```