C++ fundamentals through coding exercises
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

2.7 KiB

3 Dynaamista muistinhallintaa

Tehtävä:

Luvun viimeisenä ohjelmointitehtävänä sinun tulee laatia aliohjelma "uusi_piste", jota käytetään seuraavassa esitetyn pääohjelman osana:

int main() { Piste* pisteolio; pisteolio = uusi_piste(); pisteolio->TulostaPiste(); delete pisteolio;

return 0; }

Luokka "Piste", jota pääohjelmassa ja aliohjelmassa "uusi_piste" käytetään, sisältää kaksi jäsenmuuttujaa: koordinaatit x ja y, sekä jäsenfunktiot "TulostaPiste" ja "AsetaPiste". Funktion TulostaPiste tehtävänä on tulostaa piste-olion koordinaatit näytölle ja AsetaPiste puolestaan asettaa sille parametrina välitetyt koordinaatit olion jäsenmuuttujiin.

Sinun vastuulla olevan funktion "uusi_piste" tehtävänä on:

  • Luoda uusi (dynaaminen) olio luokasta "Piste"

    • Luominen tapahtuu seuraavan syntaksin mukaisesti: osoitin_olioon = new Piste;
  • Kysyä käyttäjältä esimerkkitulosteen esittämällä tavalla pisteoliolle asetettavat koordinaatit

  • Asettaa saadut koordinaatit funktiossa luodulle oliolle

    • Koordinaattien asetus tapahtuu seuraavan syntaksin mukaisesti: osoitin_olioon->AsetaPiste(x, y);
  • Palauttaa olion osoite sitä kutsuvalle pääohjelmalle

    • Olion osoite palautetaan seuraavan syntaksin mukaisesti: return osoitin_olioon;

Funktio "uusi_piste" palauttaa osoitteen funktion sisällä muodostettuun dynaamiseen olioon, jonka vuoksi sen prototyyppi on seuraava: Piste* uusi_piste();. Sinun tulee kirjoittaa vain funktion otsikko ja toteutus prototyyppi on valmiiksi kirjoitettu.

Example output:

Anna uuden pisteen x: 45
Anna uuden pisteen y: 3
Pisteen x-koordinaatti: 45
Pisteen y-koordinaatti: 3

Vastaus:

//** Pre-defined code in the assignment **//
#include <iostream>
using namespace std;
class Piste
{
public:
void TulostaPiste();
void AsetaPiste(int x, int y);
private:
int x_;
int y_;
};
void Piste::TulostaPiste()
{
cout << "Pisteen x-koordinaatti: " << x_ << endl;
cout << "Pisteen y-koordinaatti: " << y_ << endl;
}
void Piste::AsetaPiste(int x, int y)
{
x_ = x;
y_ = y;
}
// Funktio "uusi_piste" palauttaa osoitteen funktion sisällä
// muodostettuun dynaamiseen olioon, minkä vuoksi sen prototyyppi on seuraava:
Piste* uusi_piste();
int main()
{
Piste* pisteolio;
pisteolio = uusi_piste();
pisteolio->TulostaPiste();
delete pisteolio;
return 0;
}
//** ---------- ---------- ---------- **//
Piste* uusi_piste() {
short int x, y;
Piste* piste = new Piste;
cout << "Anna uuden pisteen x: ";
cin >> x;
if (cin.fail()) exit(1);
cout << "Anna uuden pisteen y: ";
cin >> y;
if (cin.fail()) exit(1);
piste->AsetaPiste(x, y);
return piste;
}