Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Viope: Luokkien väliset suhteet - ongelma koulutehtävässä

Venefic [02.05.2013 16:32:30]

#

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.
Esimerkkitulostus

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

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ää?

Metabolix [02.05.2013 16:36:45]

#

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.

Venefic [02.05.2013 18:28:03]

#

Kiitos vinkistä. Ongelma ratkesi.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta