Advertisement
avr39ripe

PV913OverloadFinish!

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