Advertisement
avr39ripe

PV913MoveSemanticsProblem

Jun 10th, 2020
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <iostream>
  2. #include <chrono>
  3.  
  4. #define COPY
  5. #define MOVE
  6.  
  7. class String
  8. {
  9.     char* str;
  10.     uint32_t size;
  11. public:
  12.     String(const char* strP)
  13.         : str{ new char[strlen(strP) + 1] }, size{ strlen(strP) }
  14.     {
  15.         strcpy_s(str, size+1, strP);
  16.     };
  17.  
  18.     ~String() { delete[] str; };
  19.  
  20.     String& operator=(const char* strP)
  21.     {
  22.         delete[] str;
  23.         str = new char[strlen(strP) + 1];
  24.         size = strlen(strP);
  25.         strcpy_s(str, size+1, strP);
  26.         return *this;
  27.     };
  28.  
  29.     friend std::ostream& operator<<(std::ostream& out, const String& rhs)
  30.     {
  31.         out << rhs.str;
  32.         return out;
  33.     }
  34. };
  35.  
  36.  
  37. class Number
  38. {
  39.     int num;
  40. public:
  41.     Number(int numP) : num{ numP } { std::cout << "Number constructed for " << this << " with value " << num << '\n'; }
  42.     Number() : Number{ 0 } {};
  43.     Number& operator=(const int rhs) { num = rhs; std::cout << "Number assigned for " << this << " with value " << num << '\n'; return *this; }
  44.     friend std::ostream& operator<<(std::ostream& out, const Number& rhs)
  45.     {
  46.         out << "Number: " << rhs.num;
  47.         return out;
  48.     }
  49.     ~Number() { std::cout << "Number destructed for " << this << " with value " << num << '\n'; };
  50. };
  51.  
  52. class TestNum
  53. {
  54.     Number num;
  55.     int _initNum(int max) { return rand() % max; };
  56. public:
  57.     TestNum() { num = _initNum(11);  std::cout << "TestNum constructed for " << this << '\n'; };
  58.     ~TestNum() { std::cout << "TestNum destructed for " << this << '\n'; }
  59. };
  60.  
  61. class DynArray
  62. {
  63.     int* arr;
  64.     int size;
  65. public:
  66.     DynArray(int pSize) : arr{ new int[pSize] {} }, size{ pSize } {std::cout << "DynArr constructed for " << size << " elements, for " << this << '\n'; };
  67.     DynArray() : DynArray(5) {};
  68. #ifdef COPY    
  69.     //COPY
  70.     DynArray(const DynArray& obj);
  71.     DynArray& operator=(const DynArray& obj);
  72. #endif
  73. #ifdef MOVE
  74.     //MOVE
  75.     DynArray(DynArray&& obj);
  76.     DynArray& operator=(DynArray&& obj);
  77. #endif
  78.     int getElem(int idx) { return arr[idx]; };
  79.     void setElem(int idx, int val) { arr[idx] = val; };
  80.     void print();
  81.     void randomize();
  82.     ~DynArray()
  83.     {
  84.         if (arr)
  85.         {
  86.             std::cout << "this->arr = " << this->arr << '\n';
  87.             delete[] arr;
  88.         };
  89.         std::cout << "DynArr destructed for " << size << " elements, for " << this << '\n';
  90.     };
  91. };
  92.  
  93. void DynArray::print()
  94. {
  95.     for (int i{ 0 }; i < size and arr; ++i)
  96.     {
  97.         std::cout << arr[i] << ' ';
  98.     }
  99.     std::cout << '\n';
  100. }
  101.  
  102. void DynArray::randomize()
  103. {
  104.     for (int i{ 0 }; i < size; ++i)
  105.     {
  106.         arr[i] = rand() % 10;
  107.     }
  108. }
  109.  
  110. #ifdef COPY
  111. DynArray::DynArray(const DynArray& obj)
  112.     : arr{ new int[obj.size] {} }, size{ obj.size }
  113. {
  114.     for (int i{ 0 }; i < size; ++i)
  115.     {
  116.         arr[i] = obj.arr[i];
  117.     };
  118.  
  119.     std::cout << "DynArr COPY constructed for " << size << " elements, for " << this << '\n';
  120. };
  121.  
  122. DynArray& DynArray::operator=(const DynArray& obj)
  123. {
  124.     if (this == &obj)
  125.     {
  126.         std::cout << "DynArr self assign in COPY PREVENTED! for " << this << '\n';
  127.         return *this;
  128.     }
  129.  
  130.     delete[] arr;
  131.  
  132.     arr = new int[obj.size]{};
  133.     size = obj.size;
  134.  
  135.     for (int i{ 0 }; i < size; ++i)
  136.     {
  137.         arr[i] = obj.arr[i];
  138.     };
  139.  
  140.     std::cout << "DynArr COPY assigned for " << size << " elements, for " << this << '\n';
  141.     return *this;
  142. };
  143. #endif
  144.  
  145. #ifdef MOVE
  146. DynArray::DynArray(DynArray&& obj)
  147.     : arr{ obj.arr}, size{ obj.size }
  148. {
  149.     obj.arr = nullptr;
  150.     obj.size = 0;
  151.  
  152.     std::cout << "DynArr MOVE constructed for " << size << " elements, for " << this << '\n';
  153. };
  154.  
  155. DynArray& DynArray::operator=(DynArray&& obj)
  156. {
  157.     if (this == &obj)
  158.     {
  159.         std::cout << "DynArr self assign in MOVE PREVENTED! for " << this << '\n';
  160.         return *this;
  161.     }
  162.  
  163.     delete[] arr;
  164.  
  165.     arr = obj.arr;
  166.     size = obj.size;
  167.  
  168.     obj.arr = nullptr;
  169.     obj.size = 0;
  170.  
  171.     std::cout << "DynArr MOVE assigned for " << size << " elements, for " << this << '\n';
  172.     return *this;
  173. };
  174. #endif
  175.  
  176. void printDynArrEl(DynArray& arr, int idx)
  177. {
  178.     std::cout << arr.getElem(idx) << ' ';
  179. }
  180.  
  181.  
  182. DynArray mkArray(int size)
  183. {
  184.     DynArray arrInternal{ size };
  185.     arrInternal.randomize();
  186.     return arrInternal;
  187. }
  188.  
  189. int max(int a, int b)
  190. {
  191.     return a > b ? a : b;
  192. }
  193.  
  194. void rvalDemo(int& num)
  195. {
  196.     std::cout << "L-Value version!!! " << num << '\n';
  197. }
  198.  
  199. void rvalDemo(int&& num)
  200. {
  201.     std::cout << "R-Value version!!! " << num << '\n';
  202. }
  203.  
  204.  
  205. int main()
  206. {
  207.     /*l - value
  208.     r - value*/
  209.  
  210.     //int num1{ 10 };
  211.     //int num2{ 23 };
  212.  
  213.     //rvalDemo(num1);
  214.  
  215.     //rvalDemo(std::move(num1));
  216.  
  217.     ////int& numRef{ max(num1,num2) };
  218.  
  219.     //int&& numRvalRef{ max(num1,num2) };
  220.  
  221.     //std::cout << numRvalRef << '\n';
  222.  
  223.     //numRvalRef = 789;
  224.  
  225.     //std::cout << numRvalRef << '\n';
  226.  
  227.  
  228.  
  229.     //numRef = 5555;
  230.  
  231.     //max(num1, num2) = 555;
  232.  
  233.  
  234.       /*  int x{34};
  235.         int* ptr = new int{ 444 };
  236.  
  237.         *ptr
  238.  
  239.         x = 56;
  240.  
  241.         int y{};
  242.  
  243.         y = x;*/
  244.  
  245.  
  246.     //DynArray arrExternal{};
  247.  
  248.     //arrExternal = mkArray(7);
  249.     ////arrExternal = DynArray{7};
  250.  
  251.     //arrExternal.print();
  252.  
  253.     DynArray arr1{ 7 };
  254.     arr1.randomize();
  255.     arr1.print();
  256.  
  257.     std::cout << "Create copy of arr1 in arr2!\n";
  258.     DynArray arr2{ std::move(arr1) };
  259.     arr2.print();
  260.  
  261.     std::cout << "Arr1 still alive and fully functional!\n";
  262.     arr1.print();
  263.     arr1 = DynArray{4};
  264.     arr1.print();
  265.  
  266.  
  267.     //String str{ "Initial string!" };
  268.     //std::cout << str << '\n';
  269.     //str = "Some new string";
  270.     //std::cout << str << '\n';
  271.  
  272.  
  273.     /*srand(time(nullptr));
  274.     TestNum tn;*/
  275.  
  276.     //Number n{333};
  277.     //n = 42;
  278.     //std::cout << n << '\n';
  279.      //int x{ 42 };
  280.     //x = x;
  281.  
  282.     //std::cout << "X = " << x << '\n';
  283.     //return 0;
  284. /*
  285.     std::cout << "arr1 creation\n";
  286.     DynArray arr1{8};
  287.     arr1.print();
  288.     arr1.randomize();
  289.     arr1.print();
  290.     std::cout << "arr2 creation\n";
  291.     DynArray arr2{};
  292.     arr2.randomize();
  293.     arr2.print();
  294.     arr2 = arr1; // { arr2.arr = arr1.arr; arr2.size = arr1.size; }
  295.     arr2.print();
  296.  
  297. */
  298.  
  299.     //DynArray arr{};
  300.     //arr = mkArray(8);
  301.     //arr.print();
  302.  
  303. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement