Koulutehtävässä jumiudun pienen yksityiskohdan kanssa.
Tehtävänanto on seuraavanlainen.
Viope kirjoitti:
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.
EsimerkkitulostusToyota 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
Olen tehnyt koko ohjelman kokonaisuudessaan selvittääkseni ongelman. Viopen avulla virheiden etsiminen on lähestulkoon mahdotonta. Mutta tässä oma koodini:
#include "stdafx.h" #include <string> #include <iostream> using namespace std; class Auto { public: Auto(string merkki, int ajetut_kilometrit); Auto(); void Liiku(int uudet_kilometrit); void KerroAjetutKilometrit(); private: string merkki_; int ajetut_kilometrit_; }; Auto::Auto(string merkki, int ajetut_kilometrit) : merkki_(merkki), ajetut_kilometrit_(ajetut_kilometrit) { } void Auto::Liiku(int uudet_kilometrit) { ajetut_kilometrit_ = ajetut_kilometrit_ + uudet_kilometrit; cout << "Wrooom..." << uudet_kilometrit << " kilometriä ajettu." << endl; } void Auto::KerroAjetutKilometrit() { cout << merkki_ << " merkkisellä autolla on ajettu " << ajetut_kilometrit_ << " km" << endl; } class Henkilo { public: Henkilo(string uusi_merkki, Auto* oma_auto); void AjaAutoa(int uudet_kilometrit); void VaihdaAutoa(Auto* uusi_auto); private: Auto* nykyinen_auto; }; Henkilo::Henkilo(string uusi_merkki, Auto* oma_auto) { oma_auto = new Auto(uusi_merkki, 0); nykyinen_auto = oma_auto; } void Henkilo::AjaAutoa(int uudet_kilometrit) { nykyinen_auto->Liiku(uudet_kilometrit); } void Henkilo::VaihdaAutoa(Auto* uusi_auto) { nykyinen_auto = uusi_auto; } int main() { int km1 = 25000; int km2 = 1500; Auto* auto1; auto1 = new Auto("Toyota Corolla DX", km1); Auto* auto2; auto2 = new Auto("Ferrari F50", km2); Henkilo* kalle; kalle = new Henkilo("Ferrari F50", auto1); auto1->KerroAjetutKilometrit(); kalle->AjaAutoa(1000); auto1->KerroAjetutKilometrit(); kalle->VaihdaAutoa(auto2); auto2->KerroAjetutKilometrit(); kalle->AjaAutoa(20000); auto2->KerroAjetutKilometrit(); char f; cin >> f; }
Ohjelmani tulostaa seuraavalla tavalla:
Ohjelma kirjoitti:
Toyota Corolla DX merkkisellä autolla on ajettu 25000 km
Wrooom...1000 kilometriä ajettu.
Toyota Corolla DX merkkisellä autolla on ajettu 25000 km
Ferrari F50 merkkisellä autolla on ajettu 1500 km
Wrooom...20000 kilometriä ajettu.
Ferrari F50 merkkisellä autolla on ajettu 21500 km
Ensimmäisellä autolla kilometrien lisääminen ei jostain syystä onnistu vaan se pysyy samana. Toisen auton kohdalla lisääminen kuitenkin onnistuu toivotulla tavalla. En onnistu löytämään virheen alkuperää, virhe ei kuitenkaan tapahdu kaikissa tapauksissa. Osaatteko te löytää ongelman alkuperää?
Henkilo-luokan muodostimessa luot aina uuden Auto-olion, vaikka sinun pitäisi käyttää parametrina annettua oliota. Muodostimelle ei myöskään pidä antaa tekstinä automerkkiä vaan henkilön nimi, kuten varmaan tietäisit, jos lukisit tuon tehtävänannon kunnolla.
Kiitos vinkistä. Ongelma ratkesi.
Aihe on jo aika vanha, joten et voi enää vastata siihen.