Advertisement
avr39ripe

PersonFlatPartly

Jun 18th, 2020
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.46 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class Person
  4. {
  5.     char* fname;
  6.     char* sname;
  7.     uint32_t id;
  8. public:
  9.     Person(const char* fnameP, const char* snameP, const uint32_t idP);
  10.     Person() : fname{ nullptr }, sname{ nullptr }, id{ 0 }{};
  11.     Person(const Person& personP);
  12.     Person(Person&& personP);
  13.     Person& operator=(const Person& personP);
  14.     Person& operator=(Person&& personP);
  15.     ~Person() { delete[] fname; delete[] sname; };
  16.     const char* getFname() const { return fname; };
  17.     const char* getSname() const { return sname; };
  18.     const uint32_t getId() const { return id; };
  19.     Person& setFname(const char* fnameP);
  20.     Person& setSname(const char* snameP);
  21.     Person& setId(const uint32_t idP) { id = idP; return *this; };
  22.     friend std::ostream& operator<<(std::ostream& out, const Person& personP);
  23.     friend std::istream& operator>>(std::istream& out, Person& personP);
  24.     friend bool operator==(const Person& lhs, const Person& rhs);
  25.     friend bool operator!=(const Person& lhs, const Person& rhs);
  26. };
  27.  
  28. Person::Person(const char* fnameP, const char* snameP, const uint32_t idP)
  29.     :fname{new char[strlen(fnameP)+1]}, sname{ new char[strlen(snameP) + 1] }, id{idP}
  30. {
  31.     strcpy_s(fname, strlen(fnameP) + 1, fnameP);
  32.     strcpy_s(sname, strlen(snameP) + 1, snameP);
  33. }
  34.  
  35. Person::Person(const Person& personP)
  36.     :fname{ new char[strlen(personP.fname) + 1] }, sname{ new char[strlen(personP.sname) + 1] }, id{ personP.id }
  37. {
  38.     strcpy_s(fname, strlen(personP.fname) + 1, personP.fname);
  39.     strcpy_s(sname, strlen(personP.sname) + 1, personP.sname);
  40. }
  41.  
  42. Person::Person(Person&& personP)
  43.     :fname{ personP.fname}, sname{personP.sname}, id{ personP.id }
  44. {
  45.     personP.fname = nullptr;
  46.     personP.sname = nullptr;
  47.     personP.id = 0;
  48. }
  49.  
  50. Person& Person::operator=(const Person& personP)
  51. {
  52.     if (this == &personP) { return *this; }
  53.  
  54.     delete[] fname;
  55.     delete[] sname;
  56.  
  57.     fname = new char[strlen(personP.fname) + 1];
  58.     sname = new char[strlen(personP.sname) + 1];
  59.     id =  personP.id;
  60.  
  61.     strcpy_s(fname, strlen(personP.fname) + 1, personP.fname);
  62.     strcpy_s(sname, strlen(personP.sname) + 1, personP.sname);
  63.  
  64.     return *this;
  65. }
  66.  
  67. Person& Person::operator=(Person&& personP)
  68. {
  69.     if (this == &personP) { return *this; }
  70.  
  71.     delete[] fname;
  72.     delete[] sname;
  73.  
  74.     fname = personP.fname;
  75.     sname = personP.sname;
  76.     id = personP.id;
  77.    
  78.     personP.fname = nullptr;
  79.     personP.sname = nullptr;
  80.     personP.id = 0;
  81.  
  82.     return *this;
  83. }
  84.  
  85. Person& Person::setFname(const char* fnameP)
  86. {
  87.     delete[] fname;
  88.     fname = new char[strlen(fnameP) + 1];
  89.     strcpy_s(fname, strlen(fnameP) + 1, fnameP);
  90.     return *this;
  91. };
  92.  
  93. Person& Person::setSname(const char* snameP)
  94. {
  95.     delete[] sname;
  96.     sname = new char[strlen(snameP) + 1];
  97.     strcpy_s(sname, strlen(snameP) + 1, snameP);
  98.     return *this;
  99. };
  100.  
  101. std::ostream& operator<<(std::ostream& out, const Person& personP)
  102. {
  103.     if (personP.fname and personP.sname and personP.id)
  104.     {
  105.         out << "[" << personP.id << ' ' << personP.fname << ' ' << personP.sname << "]";
  106.     }
  107.     else
  108.     {
  109.         out << "[empty person]";
  110.     }
  111.    
  112.     return out;
  113. }
  114.  
  115. std::istream& operator>>(std::istream& in, Person& personP)
  116. {
  117.     in >> personP.id >> personP.fname >> personP.sname;
  118.     return in;
  119. }
  120.  
  121. bool operator==(const Person& lhs, const Person& rhs)
  122. {
  123.     return (lhs.id == rhs.id and strcmp(lhs.fname,rhs.fname) == 0 and strcmp(lhs.sname, rhs.sname) == 0);
  124. }
  125.  
  126. bool operator!=(const Person& lhs, const Person& rhs)
  127. {
  128.     return !(lhs == rhs);
  129. }
  130.  
  131. bool testPerson()
  132. {
  133.     const Person person1{ "Ivan", "Ivanov", 1 };
  134.     Person person2{ "Sidor", "Sidorov", 2 };
  135.  
  136.     std::cout << person1 << '\n';
  137.     std::cout << person2 << '\n';
  138.  
  139.     Person person3{ person1 };
  140.     Person person4{ std::move(person2) };
  141.  
  142.     std::cout << person3 << '\n';
  143.     std::cout << person4 << '\n';
  144.  
  145.     std::cout << person1 << '\n';
  146.     std::cout << person2 << '\n';
  147.  
  148.     Person person5{};
  149.     person5.setFname("Petr").setSname("Petrov").setId(3);
  150.  
  151.     Person person6{};
  152.     person6 = person5;
  153.  
  154.     std::cout << person5 << '\n';
  155.     std::cout << person6<< '\n';
  156.  
  157.     Person person7{};
  158.     person7 = std::move(person6);
  159.  
  160.     std::cout << person6 << '\n';
  161.     std::cout << person7 << '\n';
  162.  
  163.     Person persons[3]{ {"Ivan", "Ivanov", 1},{"Sidor","Sidorov",2},{"Petr","Petrov",3} };
  164.  
  165.     for (int i{ 0 }; i < 3; ++i)
  166.     {
  167.         std::cout << persons[i];
  168.     }
  169.     std::cout << '\n';
  170.  
  171.     Person* personsDyn = new Person[3];
  172.     personsDyn[0].setFname("Ivan").setSname("Ivanov").setId(1);
  173.     personsDyn[1].setFname("Sidor").setSname("Sidorov").setId(2);
  174.     personsDyn[2].setFname("Petr").setSname("Petrov").setId(3);
  175.  
  176.     for (int i{ 0 }; i < 3; ++i)
  177.     {
  178.         std::cout << personsDyn[i];
  179.     }
  180.  
  181.     std::cout << '\n';
  182.  
  183.     for (int i{ 0 }; i < 3; ++i)
  184.     {
  185.         personsDyn[i] = std::move(persons[i]);
  186.         std::cout << persons[i];
  187.         std::cout << personsDyn[i];
  188.     }
  189.    
  190.     delete[] personsDyn;
  191.    
  192.     std::cout << '\n';
  193.  
  194.     std::cout << (Person{ "Ivan", "Ivanov", 1 } == Person{ "Ivan", "Ivanov", 1 }) << '\n';
  195.     std::cout << (Person{ "Ivan", "Ivanov", 1 } == Person{ "Ivn", "Ivaov", 2 }) << '\n';
  196.     std::cout << (Person{ "Ivan", "Ivanov", 1 } != Person{ "Ivan", "Ivanov", 1 }) << '\n';
  197.     std::cout << (Person{ "Ivan", "Ivanov", 1 } != Person{ "Ivn", "Ivaov", 2 }) << '\n';
  198.  
  199.     return true;
  200. }
  201.  
  202. class Flat
  203. {
  204.     uint32_t number;
  205.     uint16_t roomsCount;
  206.     Person* occupants;
  207.     uint16_t occupantsCount;
  208.     void _addOccupantPlace();
  209.     void _removeOccupantAt(const uint16_t idx);
  210. public:
  211.     Flat(const uint32_t numberP, const uint16_t roomsCountP)
  212.         : number{ numberP }, roomsCount{ roomsCountP }, occupants{ nullptr }, occupantsCount{ 0 } {};
  213.     Flat() : Flat(0, 0) {};
  214.     const uint32_t getNumber() const { return number; };
  215.     const uint16_t getRoomsCount() const { return roomsCount; };
  216.     Flat& setNumber(const uint32_t numberP) { number = numberP; return *this; };
  217.     Flat& setRoomsCount(const uint16_t roomsCountP) { roomsCount = roomsCountP; return *this; };
  218.     ~Flat() { delete[] occupants; }
  219.     Flat& addOccupant(const Person& personP);
  220.     Flat& addOccupant(Person&& personP);
  221.     bool removeOccupant(const Person& personP);
  222.     bool removeOccupantById(const uint16_t id);
  223.     friend std::ostream& operator<<(std::ostream& out, const Flat& flatP);
  224.     //friend std::istream& operator>>(std::istream& out, Flat& flatP);
  225. };
  226.  
  227. void Flat::_addOccupantPlace()
  228. {
  229.     Person* newOccupants{ new Person[occupantsCount + 1] };
  230.     for (uint16_t i{ 0 }; i < occupantsCount; ++i)
  231.     {
  232.         newOccupants[i] = std::move(occupants[i]);
  233.     }
  234.     delete[] occupants;
  235.     occupants = newOccupants;
  236.     ++occupantsCount;
  237. }
  238.  
  239. void Flat::_removeOccupantAt(const uint16_t idx)
  240. {
  241.     Person* newOccupants{ new Person[occupantsCount - 1] };
  242.     for (uint16_t i{ 0 }; i < occupantsCount - 1; ++i)
  243.     {
  244.         i < idx ? newOccupants[i] = std::move(occupants[i]) : newOccupants[i] = std::move(occupants[i+1]);
  245.     }
  246.     delete[] occupants;
  247.     occupants = newOccupants;
  248.     --occupantsCount;
  249. }
  250.  
  251. Flat& Flat::addOccupant(const Person& personP)
  252. {
  253.     _addOccupantPlace();
  254.     occupants[occupantsCount - 1] = personP;
  255.     return *this;
  256. }
  257.  
  258. Flat& Flat::addOccupant(Person&& personP)
  259. {
  260.     _addOccupantPlace();
  261.     occupants[occupantsCount - 1] = std::move(personP);
  262.     return *this;
  263. }
  264.  
  265. bool Flat::removeOccupant(const Person& personP)
  266. {
  267.     for (uint16_t i{ 0 }; i < occupantsCount; ++i)
  268.     {
  269.         if (occupants[i] == personP)
  270.         {
  271.             _removeOccupantAt(i);
  272.             return true;
  273.         }
  274.     }
  275.     return false;
  276. }
  277.  
  278. bool Flat::removeOccupantById(const uint16_t id)
  279. {
  280.     for (uint16_t i{ 0 }; i < occupantsCount; ++i)
  281.     {
  282.         if (occupants[i].getId() == id)
  283.         {
  284.             _removeOccupantAt(i);
  285.             return true;
  286.         }
  287.     }
  288.     return false;
  289. }
  290.  
  291. std::ostream& operator<<(std::ostream& out, const Flat& flatP)
  292. {
  293.     if (flatP.number and flatP.roomsCount)
  294.     {
  295.         out << "[ #" << flatP.number << ' ' << flatP.roomsCount << " rooms ";
  296.         if (flatP.occupantsCount)
  297.         {
  298.             for (uint16_t i{ 0 }; i < flatP.occupantsCount; ++i)
  299.             {
  300.                 out << flatP.occupants[i];
  301.             }
  302.         }
  303.         else
  304.         {
  305.             out << "[no occupants]";
  306.         }
  307.         out << "]";
  308.     }
  309.     else
  310.     {
  311.         out << "[empty flat]";
  312.     }
  313.     return out;
  314. }
  315. bool testFlat()
  316. {
  317.     Flat flat1{};
  318.     std::cout << flat1 << '\n';
  319.  
  320.     Flat flat2{1,3};
  321.     std::cout << flat2 << '\n';
  322.  
  323.     flat2.addOccupant(Person{ "Ivan","Ivanov", 1}).addOccupant(Person{ "Sidor","Sidorov", 2});
  324.     std::cout << flat2 << '\n';
  325.  
  326.     Person person1{ "Petr", "Petrov",3 };
  327.     flat2.addOccupant(person1);
  328.  
  329.     Person person2{ "Ivan", "Durak",4 };
  330.     flat2.addOccupant(std::move(person2));
  331.  
  332.     std::cout << flat2 << '\n';
  333.     std::cout << person1 << '\n';
  334.     std::cout << person2 << '\n';
  335.  
  336.     flat2.removeOccupant(Person{ "Ivan", "Durak",4 });
  337.     std::cout << flat2 << '\n';
  338.     flat2.removeOccupantById(1);
  339.     std::cout << flat2 << '\n';
  340.     return true;
  341. }
  342.  
  343. int main()
  344. {
  345.     testPerson();
  346.     testFlat();
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement