Advertisement
Guest User

Untitled

a guest
Mar 25th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.89 KB | None | 0 0
  1. // zad1
  2. // zapoznaj się z implementacją klasy info (klasa raportuje operacje na niej wykonywane, obiekty są automatycznie numerowane)
  3. // dokończ implementację klasy schowek
  4. // klasa schowek przechowuje (za pomocą wskaźnika) daną typu info, lub nic (np. po konstrukji bezargumentowej)
  5. // klasa schowek winna posiadać zwykłe i przenoszące warianty konstruktora (kopiującego) i operatora przypisania oraz konstruktor
  6. // z argumentem &info, konstruktor bezargumentowy i destruktor, metody te powinny na wyjście raportować wykonywane operacje;
  7. // wywołanie metody przenoszącej schowka nie powinno powodować konstrukcji obiektu info, ani błędów przy poźniejszej destrukcji
  8. // przeanalizuj efekty wywołania funkcji zad1 - wykonując ją krokowo oraz śledząc komunikaty wyprowadzanie na konsolę
  9. // rozbuduj funkcję zad1, by ten sposób sprawdzić:
  10. // -w jakich sytuacjach wywoływane są metody zwykłe, a kiedy przenoszące (w razie potrzeby dopisz nowe metody/operatory do schowka)?
  11. // -co jest wywoływane przy konstrukcji/przypisaniu do schowka z wyrażenia zwracającego tymczasowy nienazwany schowek?
  12. // -co jest wywoływane przy konstrukcji/przypisaniu do schowka ze zmiennej zwracanej z funkcji przez wartość?
  13. // -wypróbuj działanie move(), co się stanie gdy użyjemy move(), a w klasie nie ma metod przenoszących(zakomentuj je chwilowo)?
  14. // -czy kompilator poprawnie rozpoznał wszystkie sytuacje kiedy można użyć metody przenoszącej?
  15. // -czy metody przenoszące poprawiają wydajność kodu? Odpowiedź uzasadnij.
  16.  
  17. // zad2
  18. // zapoznaj się za strukturą osoba i funkcją zad2
  19. // dokończ funkcję zad2 posługując się algorytmami stl (sort for_each) i funkcjami lambda tak, aby
  20. // - posortować listę liste osob los wg wieku osób
  21. // - wyświetlić posortowane osoby (tylko imie i wiek każdej osoby)
  22. // - zwiększyć wiek każdej z osób o 1 i ponownie wyświetlić listę
  23. // - wyznaczyć średni wiek osoby, wyświetlić go i wyświetlić osoby starsze niż średnia
  24. // uwaga: w capture list funkcji lambda należy przekazywać wyłącznie faktycznie potrzebne zmienne, nie używać [&] ani tym bardziej [=]
  25.  
  26.  
  27.  
  28.  
  29. #include <iostream>
  30. #include <vector>
  31. #include <string>
  32. #include <algorithm>
  33.  
  34. using namespace std;
  35.  
  36.  
  37. class info
  38. {
  39. static int serial, // ++ przy konstrukcji
  40. cntr; // ++ przy konstrukcji, -- przy destrukcji, zwracany przez getcntr
  41. const int nr; // =++serial przy konstrukcji
  42. public:
  43. static int getcntr() { return cntr; };
  44. info() :nr(++serial) { cntr++; cout << "\ninfo() nr: " << nr; }
  45. info(const info &cri) :nr(++serial) { cntr++; cout << "\ninfo(const info &cri) nr: " << nr << " cri.nr: " << cri.nr; }
  46. ~info() { cntr--; cout << "\n~info() nr: " << nr; }
  47. info & operator=(const info &cri) { cout << "\ninfo & operator=(const info &cri) nr: " << nr << " cri.nr: " << cri.nr; return *this; }
  48. friend ostream& operator<<(ostream &os, const info& cri) { return os << " info nr: " << cri.nr; }
  49. };
  50. int info::serial = 0, // static w klasie
  51. info::cntr = 0; // static w klasie
  52.  
  53.  
  54. struct osoba
  55. {
  56. string imie, nazwisko;
  57. int wiek;
  58. // osoba():wiek(-1){}
  59. osoba(const string & imie, const string & nazwisko, const int wiek) :imie(imie), nazwisko(nazwisko), wiek(wiek) {}
  60. friend ostream& operator<<(ostream &os, const osoba& cro) { return os << endl << cro.imie << ' ' << cro.nazwisko << ' ' << cro.wiek; }
  61. };
  62.  
  63.  
  64. class schowek
  65. {
  66. info *ptr; // gdy ==nullptr, to schowek jest pusty
  67. public:
  68. schowek() :ptr(nullptr) { cout << "\nschowek()"; }
  69. schowek(const info &crt) :ptr(new info(crt)) { cout << "\nschowek(const info &crt)"; }
  70. ~schowek() { cout << "\n~schowek()"; delete ptr; }
  71. friend ostream& operator<<(ostream &os, const schowek& crs) { return crs.ptr ? os << *crs.ptr : os << " nullptr"; }
  72.  
  73. //TODO
  74.  
  75. schowek(const schowek &crs);
  76. schowek(schowek &&rrs);
  77. schowek& operator=(const schowek &crs);
  78. schowek& operator=(schowek &&rrs);
  79. };
  80.  
  81.  
  82. void zad1()
  83. {
  84. info i1;
  85. schowek si1(i1),
  86. si2,
  87. si3(i1),
  88. si4(si1),
  89. si5(move(si4));
  90.  
  91. cout << endl << si1 << si2 << si3 << si4 << si5;
  92.  
  93. cout << "\n\n zamiana s1-s2 z move(), przed " << si1 << si2 << si3;
  94.  
  95. si3 = move(si2);
  96. si2 = move(si1);
  97. si1 = move(si3);
  98.  
  99. cout << "\n\n zamiana s1-s2 bez move(), przed " << si1 << si2 << si3;
  100.  
  101. si3 = si2;
  102. si2 = si1;
  103. si1 = si3;
  104.  
  105. cout << "\n\n po zamianie " << si1 << si2 << si3;
  106.  
  107. //TODO
  108.  
  109. }
  110.  
  111.  
  112. void zad2()
  113. {
  114. vector<osoba> los;
  115. los.push_back(osoba("Jan", "Kowalski", 25));
  116. los.push_back(osoba("Tomek", "Kowalski", 5));
  117. los.push_back(osoba("Anna", "Kowalska", 20));
  118. los.push_back(osoba("Antoni", "Kowalski", 65));
  119. los.push_back(osoba("Onufry", "Kowalski", 99));
  120. los.push_back(osoba("Zosia", "Kowalska", 3));
  121.  
  122. cout << "\n\n Lista osob:";
  123. for (auto const & p : los) cout << p;
  124.  
  125.  
  126. // odtąd bez deklarowania zmiennych typu iteratorowego (jawnie ani auto), bez for, z algorytmami i funkcjami lambda
  127. // użyj wartości iteratora zwracanej przez metody kontenera .begin(), .end() jako argumentów algorytmów
  128.  
  129. cout << "\n\n Sortowanie wg wieku...";
  130. //TODO
  131. cout << "\n\n Lista (imie i wiek):";
  132. //TODO
  133. cout << "\n\n Zwiekszenie wieku:";
  134. //TODO
  135. cout << "\n\n Lista:";
  136. //TODO
  137. cout << "\n\n Sredni wiek...";
  138. //TODO
  139. cout << "\n\n Starsi od sredniej:";
  140. //TODO
  141. }
  142.  
  143. int main()
  144. {
  145. int checkleak = info::getcntr();
  146. zad1();
  147. if (checkleak != info::getcntr())
  148. cerr << "\n\n\tWYCIEK PAMIECI !!!\n";
  149.  
  150. zad2();
  151. return 0;
  152. }
  153.  
  154. schowek::schowek(const schowek & crs)
  155. {
  156. ptr = new info(*crs.ptr);
  157. }
  158.  
  159. schowek::schowek(schowek && rrs)
  160. {
  161. ptr = move(rrs.ptr);
  162. rrs.ptr = nullptr;
  163. }
  164.  
  165. schowek & schowek::operator=(const schowek & crs)
  166. {
  167. if (crs.ptr == nullptr)
  168. {
  169. return *this;
  170. }
  171. if (this != &crs)
  172. {
  173. delete ptr;
  174. ptr = new info(*crs.ptr);
  175. }
  176. return *this;
  177. }
  178.  
  179. schowek & schowek::operator=(schowek && rrs)
  180. {
  181. if (this != &rrs)
  182. {
  183. delete ptr;
  184. ptr = rrs.ptr;
  185. rrs.ptr = nullptr;
  186. }
  187. return *this;
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement