Advertisement
RobertDeMilo

BB4.*

Jun 21st, 2024
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.74 KB | None | 0 0
  1.  
  2. #include <iostream>
  3. // Фабрика создает объект и передает его в уникальное владение вызывающей стороне
  4.  
  5. unique_ptr<Animal> CreateAnimal(const string& name)
  6. {
  7.     if(name == "Tiger")
  8.     {
  9.         return make_unique<Tiger>();
  10.     }
  11.      if(name == "Wolf")
  12.     {
  13.         return make_unique<Wolf>();
  14.     }
  15.      if(name == "Fox")
  16.     {
  17.         return make_unique<Fox>();
  18.     }
  19.     return nullptr;
  20. }
  21.  
  22. class Shape
  23. {
  24.     shape_ptr<Texture> texture_;
  25.     public:
  26.     //Новая фигура будет учавствовать в совместном владении текстурой, переданной в конструктор
  27.     Shape(shared_ptr<Texture> texture):texture_(move(Texture)){}
  28. };
  29.  
  30. //Переданный указатель не участвует во владении объектом выражения
  31. void Print(const Expression*e)
  32. {
  33.     if(!e)
  34.     {
  35.         cout<<"Null expression provided"<<endl;
  36.         return;
  37.     }
  38.     cout<<e->ToString()<< " = " <<e->Evaluate()<<endl;
  39. }
  40.  
  41. ////////////////////////////////////////////////////////////////////////////////////////////////////
  42.  
  43. struct A{/*...*/};
  44.  
  45. int main()
  46. {
  47.     A* ptr = new A;
  48. }
  49.  
  50. /////////////////////////////////////////////////////////////////////////////////////////////////////
  51. void UseA(int x)
  52. {
  53.     A* ptr = new A;
  54.     if(x<0)
  55.     {
  56.         return;
  57.     }
  58.     delete ptr;
  59. }
  60. int main()
  61. {
  62.     UseA(-1);
  63. }
  64. /////////////////////////////////////////////////////////////////////////////////////////////////////
  65.  
  66. struct A{/*...*/};
  67.  
  68. int main()
  69. {
  70.     A* ptr = new A;
  71.     unique_ptr<A> up1(ptr);
  72.     unique_ptr<A> up2(ptr);
  73.    
  74. }
  75. /////////////////////////////////////////////////////////////////////////////////////////////////////
  76.  
  77. struct A{/*...*/};
  78.  
  79. int main()
  80. {
  81.     A* ptr = new A;
  82.     shared_ptr<A> up1(ptr);
  83.     shared_ptr<A> up2(ptr);
  84. }
  85. /////////////////////////////////////////////////////////////////////////////////////////////////////
  86. struct A{/*...*/};
  87.  
  88. A* MAkeA()
  89. {
  90.     return new A;
  91. }
  92.  
  93. int main()
  94. {
  95.     unique_ptr<A> up(MakeA());
  96.     shared_ptr<A> sp(MakeA());
  97. }
  98. ////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. struct A{/*...*/};
  100.  
  101. unique_ptr<A> MAkeA()
  102. {
  103.     return make_unique<A>();
  104. }
  105.  
  106. int main()
  107. {
  108.     unique_ptr<A> up =MakeA();
  109.     shared_ptr<A> sp= MakeA();
  110. }
  111. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. struct A{/*...*/};
  113.  
  114.  
  115. int main()
  116. {
  117.     auto up1 = make_unique<A>();
  118.     unique_ptr<A> up2(up1.get());
  119. }
  120. //////////////////////////////////////////////////////////////////////////////////////////////////////////
  121. class Cache
  122. {
  123.     public:
  124.     shared_ptr<Widget> GetWidget(const string&name)
  125.     {
  126.         if(!map_[name])
  127.         {
  128.             map_[name] = make_shared<Widget>(name);
  129.         }
  130.         return map_[name];
  131.     }
  132.     private:
  133.     map<string,shared_ptr<Widget>> map_;
  134. };
  135. ///
  136. class Cache
  137. {
  138.     public:
  139.     shared_ptr<Widget> GetWidget(const string&name)
  140.     {
  141.         auto ret = map_[name].lock();
  142.        
  143.         if(!ret)
  144.         {
  145.           ret = make_shared<Widget>(name);
  146.           map_[name] = ret;
  147.         }
  148.         return ret;
  149.     }
  150.     private:
  151.     map<string,weak_ptr<Widget>> map_;
  152. };
  153. ///////////////////////////////////////////
  154. Widget *  GetNonOwningPtr();
  155. shared_ptr<Widget> GetOwningPtr();
  156.  
  157. shared_ptr<Widget> GetWidget(bool owning)
  158. {
  159.     if(owning)
  160.     {
  161.         return GetOwningPtr();
  162.     }
  163.     else
  164.    
  165.     {
  166.         Widget * ptr = GetNonOwningPtr();
  167.         auto dummyDeleter = [](Widget*){};
  168.         return shared_ptr<Widget>(ptr,dummyDeleter);
  169.     }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement