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.

110 lines
3.2 KiB

4 years ago
  1. ## 1 Kopiointi- ja sijoitusmuodostimen toteuttaminen
  2. **Tehtävä:**
  3. Kurssin viimeisessä 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.
  4. 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.
  5. 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.
  6. Luokkaa testataan pääohjelmassa, josta siitä tehdään luku-olioita joita kopioidaan ja sijoitetaan toisiinsa.
  7. Example output:
  8. ```
  9. Luku on: 100
  10. Luku on: 100
  11. Luku on: 100
  12. Luku on: 200
  13. Luku on: 300
  14. Luku on: 200
  15. ```
  16. **Vastaus:**
  17. ```
  18. #include <iostream>
  19. using namespace std;
  20. class Luku {
  21. public:
  22. Luku();
  23. ~Luku();
  24. void Tulosta();
  25. void Muuta(int luku);
  26. // Introduce copy constructor
  27. Luku(const Luku& obj);
  28. // Introduce assignment operator
  29. Luku& operator=(const Luku& obj);
  30. private:
  31. int * luku_;
  32. };
  33. Luku::Luku()
  34. {
  35. luku_ = new int;
  36. *luku_ = 0;
  37. }
  38. Luku::~Luku()
  39. {
  40. delete luku_;
  41. }
  42. void Luku::Muuta(int luku)
  43. {
  44. *luku_ = luku;
  45. }
  46. void Luku::Tulosta()
  47. {
  48. cout << "Luku on: " << *luku_ << endl;
  49. }
  50. // Define copy constructor: perform deep copy
  51. Luku::Luku(const Luku& obj)
  52. {
  53. luku_ = new int;
  54. *luku_ = *obj.luku_;
  55. }
  56. // Define assignment operator
  57. Luku& Luku::operator=(const Luku& obj)
  58. {
  59. *luku_ = *obj.luku_;
  60. return *this;
  61. }
  62. //** Pre-defined code in the assignment **//
  63. int main()
  64. {
  65. Luku eka;
  66. eka.Muuta(100);
  67. eka.Tulosta(); // Luku on: 100 Print current value of eka
  68. Luku toka(eka);
  69. toka.Tulosta(); // Luku on: 100 copy of eka
  70. eka.Muuta(200);
  71. toka.Tulosta(); // Luku on: 100 copy of original eka, different memory address
  72. toka = eka;
  73. toka.Tulosta(); // Luku on: 200; toka gets same value than eka
  74. eka.Muuta(300);
  75. eka.Tulosta(); // Luku on: 300 // print current value of eka
  76. toka.Tulosta(); // Luku on: 200 // print current value of toka
  77. return 0;
  78. }
  79. //** ---------- ---------- ---------- **//
  80. ```