avr39ripe

cppDynArrayInputOutput

Jul 22nd, 2021
983
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #include <iostream>
  2.  
  3. class DynArray
  4. {
  5.     int* arr;
  6.     int size;
  7. public:
  8.     DynArray(int sizeP)
  9.         : arr{ new int[sizeP] {} }, size{ sizeP }
  10.     {
  11.         std::cout << "DynArr constructed for " << size
  12.             << " elements, for " << this << '\n';
  13.     }
  14.     DynArray() : DynArray(5) {}
  15.     DynArray(const DynArray& object)
  16.         : arr{ new int[object.size] }, size{ object.size }
  17.     {
  18.         for (int i{ 0 }; i < size; ++i)
  19.         {
  20.             arr[i] = object.arr[i];
  21.         };
  22.         std::cout << "DynArr copy constructed for "
  23.             << size << " elements, for " << this
  24.             << '\n';
  25.     }
  26.  
  27.     DynArray(DynArray&& object)
  28.         : arr{object.arr}, size{ object.size }
  29.     {
  30.         object.arr = nullptr;
  31.         object.size = 0;
  32.  
  33.         std::cout << "DynArr move constructed for "
  34.             << size << " elements, for " << this
  35.             << '\n';
  36.     }
  37.  
  38.     DynArray& operator=(const DynArray& object)
  39.     {
  40.         // проверка на самоприсваивание
  41.         if (!(this == &object))
  42.         {
  43.             /*  проверяем на невозможность "переиспользовать" блок
  44.                 памяти, выделенный под имеющийся массив */
  45.             if (size != object.size)
  46.             {
  47.                 /* в случае невозможности "переиспользования"
  48.                 необходимо освободить память, УЖЕ занимаемую
  49.                 элементами текущего динамического массива */
  50.                 delete[] arr;
  51.                 /*  выделяем новый блок памяти согласно
  52.                     размера копируемого массива */
  53.                 arr = new int[object.size];
  54.             }
  55.             size = object.size;
  56.             /*  Следующим циклом копируем элементы
  57.                 из оригинального блока памяти во вновь
  58.                 выделенный.*/
  59.             for (int i{ 0 }; i < size; ++i)
  60.             {
  61.                 arr[i] = object.arr[i];
  62.             };
  63.         }
  64.  
  65.         std::cout << "DynArr copy assigned for "
  66.             << size << " elements, for " << this
  67.             << '\n';
  68.  
  69.         return *this;
  70.     }
  71.    
  72.     DynArray& operator=(DynArray&& object)
  73.     {
  74.         if (!(this == &object))
  75.         {
  76.             delete[] arr;
  77.             arr = object.arr;
  78.             size = object.size;
  79.  
  80.             object.arr = nullptr;
  81.             object.size = 0;
  82.         }
  83.  
  84.         std::cout << "DynArr move assigned for "
  85.             << size << " elements, for " << this
  86.             << '\n';
  87.         return *this;
  88.     }
  89.  
  90.  
  91.     int getElem(int idx)const { return arr[idx]; }
  92.     void setElem(int idx, int val) { arr[idx] = val; }
  93.  
  94.     void print()const;
  95.     void randomize();
  96.  
  97.     ~DynArray()
  98.     {
  99.         std::cout << "Try to free memory from DynArray for"
  100.             << arr << " pointer\n";
  101.         if (arr)
  102.         {
  103.             delete[] arr;
  104.         }
  105.         else
  106.         {
  107.             std::cout << "NO DELETE MEMORY!NULLPTR FOUND!\n";
  108.         }
  109.         std::cout << "DynArr destructed for " << size
  110.             << " elements, for " << this << '\n';
  111.     }
  112.     friend std::ostream& operator<<(std::ostream& out, const DynArray& object);
  113.     friend std::istream& operator>>(std::istream& in, const DynArray& object);
  114.  
  115. };
  116. void DynArray::print()const
  117. {
  118.     if (!size and !arr) { std::cout << "[EMPTY]\n"; return; }
  119.  
  120.     for (int i{ 0 }; i < size; ++i)
  121.     {
  122.         std::cout << arr[i] << ' ';
  123.     }
  124.     std::cout << '\n';
  125. }
  126. void DynArray::randomize()
  127. {
  128.     for (int i{ 0 }; i < size; ++i)
  129.     {
  130.         arr[i] = rand() % 10;
  131.     }
  132. }
  133.  
  134.  
  135. DynArray arrayFactory(int arrSize)
  136. {
  137.     DynArray arrObject{ arrSize };
  138.     arrObject.randomize();
  139.     return arrObject;
  140. }
  141.  
  142.  
  143. // FunA
  144. void funA(int& val)
  145. {
  146.     std::cout << "FunA() called for int&\n";
  147. }
  148. void funA(const int& val)
  149. {
  150.     std::cout << "FunA() called for const int&\n";
  151. }
  152. void funA(int&& val)
  153. {
  154.     std::cout << "FunA() called for int&&\n";
  155. }
  156. //FunB
  157. void funB(int& val)
  158. {
  159.     std::cout << "FunB() called for int&\n";
  160. }
  161. void funB(const int& val)
  162. {
  163.     std::cout << "FunB() called for const int&\n";
  164. }
  165.  
  166. std::ostream& operator<<(std::ostream& out, const DynArray& object)
  167. {
  168.     if (!object.size and !object.arr) { out << "[EMPTY]\n"; return out; }
  169.  
  170.     for (int i{ 0 }; i < object.size; ++i)
  171.     {
  172.         out << object.arr[i] << ' ';
  173.     }
  174.     out << '\n';
  175.  
  176.     return out;
  177. }
  178.  
  179. std::istream& operator>>(std::istream& in, const DynArray& object)
  180. {
  181.     if (!object.size and !object.arr) { std::cout << "[EMPTY]\n"; return in; }
  182.  
  183.     std::cout << "Enter array elements one by one\n";
  184.     for (int i{ 0 }; i < object.size; ++i)
  185.     {
  186.         in >> object.arr[i];
  187.     }
  188.    
  189.     return in;
  190. }
  191.  
  192. int main()
  193. {
  194.     //int val{ 33 };
  195.     //const int cVal{ 26 };
  196.     //funA(val);
  197.     //funA(cVal);
  198.     //funA(100 + 500);
  199.     //funB(val);
  200.     //funB(cVal);
  201.     //funB(100 + 500);
  202.     DynArray ar1{4};
  203.     //ar1 = arrayFactory(8);
  204.     ////ar1.print();
  205.     //std::cout << ar1 << '\n';
  206.  
  207.     //DynArray ar2{ std::move(ar1)};
  208.     //
  209.     ////ar1.print();
  210.     std::cout << ar1 << '\n';
  211.  
  212.     std::cin >> ar1;
  213.  
  214.     std::cout << ar1 << '\n';
  215.     /*ar1 = arrayFactory(2);
  216.     ar1.print();
  217.     */
  218.     return 0;
  219.  
  220. }
RAW Paste Data