Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Pieni ongelma

Ben [20.05.2009 16:24:28]

#

hei,

Mikä tässä koodissa mättää, kun en saa tulostettua:

Luku on: 100
Luku on: 100
Luku on: 100
Luku on: 200
Luku on: 300
Luku on: 200

class Luku
{
  public:
    Luku();
   Luku& operator=( Luku& sijoitettava_luku);

    void Tulosta();
    void Muuta(int uusi_luku);

  private:
  int* luku_;

};

Luku::Luku() : luku_(NULL)
  {
    luku_ = new int;
    *luku_ = 0;
  }

  void Luku::Muuta(int uusi_luku)
  {
    *luku_ = uusi_luku ;

  }

  void Luku::Tulosta()
  {
    cout << "Luku on: " << *luku_ << endl;
  }
  Luku& Luku::operator=( Luku& sijoitettava_luku)
  {
    *luku_ = *sijoitettava_luku.luku_;
  }

Mod. lisäsi kooditagit

eq [20.05.2009 17:18:43]

#

Koodia on helpompi lukea, kun se laitetaan oikeiden tagien sisään</ot>

Nopealla vilkaisulla en huomannut mainittavampia virheitä koodissa (pl. muistinhallinnassa), mutta sinänsähän tuo koodi ei sisällä mitään osaa, joka haluamasi tulosteen loisi; vain mahdollistaa sen. Luonnollisestikaan et liittänyt viestiisi koko ohjelmaa, mutta tarkentaisitko silti ongelmaasi?

Ben [20.05.2009 19:23:31]

#

Toi koodi tulostaa:

Luku on: 100
Luku on: 100
Luku on: 200
Luku on: 200
Luku on: 300
Luku on: 300

os [20.05.2009 19:38:31]

#

No ei kyllä varmasti tulosta :)

eq tarkoitti siis, että joko kertoisit, mitä ohjelman oikeastaan pitäisi tehdä tai liittäisit mukaan enemmän koodia, erityisesti sen osan ohjelmasta, joka tuota Tulosta-metodia kutsuu. Tuosta koodista ei näe, mitä yrität tehdä tai mikä on vialla (paitsi se, että luokastasi selvästi puuttuu destruktori, mutta tämä ei nähtävästi ole nyt ongelmana).

EDIT: onko kyseessä joku tarkistusrobotille lähetettävä harjoitustehtävä?

Ben [20.05.2009 20:07:18]

#

Tässä on tehtävä:

tehtävä kirjoitti:

Tehtävässä sinun tulee määritellä luokka öLukuö, sekä toteuttaa tähän kuuluvat jäsenfunktiot. Luokka sisältää yhden jäsenmuuttujan öluku_ö, joka on osoitin kokonaislukutyypin (int) tietoon. Kun luokasta muodostetaan olio, on sen oletusmuodostimen varattava osoittimen mukainen muistialue, osoitettava varattu muisti luokan jäsenmuuttujaan ja alustettava varattu tila arvolla 0. Vastaavasti purkajan tehtävänä on vapauttaa luokan tarvitsema muisti kun luku-olio tuhotaan.

Luku-luokassa on kaksi ötavallistaö jäsenfunktiota: Tulosta() ja Muuta(). Edellinen funktio tulostaa luku-olion jäsenmuuttujan osoittaman sisällön esimerkkitulosteen mukaisesti ja jälkimmäinen muuttaa sisällön parametrina välitetyllä arvolla. öTulostaö ei siis ota vastaan parametreja eikä palauta arvoa, kun taas öMuutaö saa kokonaislukuparametrin muttei palauta mitään.

Edellisten lisäksi luokkaan on kirjoitettava kopiointi- ja sijoitusmuodostimet. Kopiomuodostimen on toimittava siten, että luku-olion kopion jäsenmuuttujan viittaama arvo on sama kuin alkuperäisellä luku-oliolla kuitenkin niin, että alkuperäinen ja kopio viittaavat eri muistialueisiin. Muistialueet sisältävät vain saman arvon. Sijoitusoperaattorin toteuttamisessa on toimittava samoin. Jos luku-olio sijoitetaan toiseen, saa sijoituksen kohde sijoitettavan luku-olion tilan mutta muutokset sijoituksen kohteena olevan olion tilassa eivät saa näkyä sijoitettavassa oliossa.

Luokkaa testataan pääohjelmassa, josta siitä tehdään luku-olioita joita kopioidaan ja sijoitetaan toisiinsa.

Mod. huom: laita muualta lainatut tekstit lainaustageihin!

os [20.05.2009 20:29:26]

#

No destruktorin (purkaja/destructor) lisäksi sinulta puuttu tuo kopiomuodostin (copy constructor), minkä vuoksi ohjelma ei toimi halutulla tavalla.

EDIT: Eli siis Luku a = b; -tyylinen lause ei todellisuudessa kutsu sijoitusoperaattoria operator=(...) vaan kopiomuodostinta.

Ben [20.05.2009 20:55:43]

#

Kiitos vinkistä sain toimimaan...

Vastaus

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

Tietoa sivustosta