Advertisement
Guest User

Untitled

a guest
Jun 26th, 2017
118
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. #ifndef SHARED_PTR_H
  2. #define SHARED_PTR_H
  3. #include <vector>
  4.  
  5. template<typename T>
  6. class shared_ptr
  7. {
  8. private:
  9.     template <typename T2=T>
  10.     class storage{
  11.     public:
  12.         T* pObj;
  13.         int count=0;
  14.     };
  15.     int index;
  16.     static std::vector< storage<T> > setOfPointers;
  17. public:
  18.     shared_ptr(T* pObj_=nullptr);
  19.     ~shared_ptr();
  20.     shared_ptr(const shared_ptr<T> &p);
  21.     shared_ptr<T>& operator=(const shared_ptr<T> &p);
  22.     T& operator*();
  23.     T* operator->();
  24. };
  25.  
  26.  
  27. template <typename T>
  28. shared_ptr<T>::shared_ptr(T* pObj_){
  29.     bool finded=false;
  30.     for(int i=0;i<setOfPointers.size();i++){
  31.         if(setOfPointers.at(i).pObj==pObj_){
  32.             finded=true;
  33.             index=i;
  34.             setOfPointers.at(index).count++;
  35.             break;
  36.         }
  37.     }
  38.     if(!finded){
  39.         storage<T> tmp;
  40.         tmp.count++;//Эквивалентно tmp.count=1;
  41.         tmp.pObj=pObj_;
  42.         setOfPointers.push_back(tmp);
  43.     }
  44. }
  45.  
  46. template <typename T>
  47. shared_ptr<T>::shared_ptr(const shared_ptr<T> &p){
  48.     index=p.index;//Этого достаточно
  49. }
  50.  
  51. template <typename T>
  52. shared_ptr<T>& shared_ptr<T>::operator=(const shared_ptr<T> &p){
  53.     if(index==p.index)
  54.         return *this;//Случай когда p=p;
  55.     if(setOfPointers.at(index).count==1)//То есть текущий указатель единственный, следует удалить
  56.         delete setOfPointers.at(index).pObj;//Удаляем текущий объект
  57.     index=p.index;//Указываем теперь на новый
  58.     return *this;
  59. }
  60.  
  61.  
  62. template <typename T>
  63. shared_ptr<T>::~shared_ptr(){
  64.     setOfPointers.at(index).count--;
  65.     if(setOfPointers.at(index).count==0){
  66.         delete setOfPointers.at(index).pObj;
  67.     }
  68. }
  69.  
  70. template <typename T>
  71. T& shared_ptr<T>::operator*(){
  72.     return *(setOfPointers.at(index).pObj);
  73. }
  74.  
  75. template <typename T>
  76. T* shared_ptr<T>::operator->(){
  77.     return setOfPointers.at(index).pObj;
  78. }
  79.  
  80.  
  81.  
  82. #endif // SHARED_PTR_H
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement