zoukankan      html  css  js  c++  java
  • 自己写的一个智能指针类

    #pragma once

    template <typename T>
    class PtrData
    {
     friend class CSmartPtr<T>;
    public:
     explicit PtrData( const T* pT):p_(pT) { count_ = 1; }
     ~PtrData() { delete p_; count_ = 0; }
     void operator ++ () { ++count_; }
     void operator -- () { --count_; if (count_ == 0) { delete this; } }
     T* operator -> () const { return p_; }
     T& operator * () const { return *p_; }
     bool operator == (T* pt) const { return p_ == pt; }
     T* get () const { return p_; }
     unsigned int use_count() const { return count_; }
    private:
     T* p_;
        unsigned int count_;
    };


    template <typename T>
    class CSmartPtr
    {
    public:
     CSmartPtr():ptr_(NULL){}
     explicit CSmartPtr(T* pT):ptr_(NULL)
     {
      ptr_ = new PtrData<T>(pT);
     }

     CSmartPtr(const CSmartPtr<T>& rt)
     {
      ptr_ = rt.get_ptr();
      if (ptr_ != NULL)
      {
       ++(*ptr_);
      }
     }

     ~CSmartPtr()
     {
      if (ptr_ != NULL)
      {
       --(*ptr_);
      }
     }

     CSmartPtr<T>& operator = (const CSmartPtr<T>& rt)
     {
      if (ptr_ != NULL)
      {
       --(*ptr_);
      }

      ptr_ = rt.get_ptr();
      ++(*ptr_);

      return *this;
     }

     T* operator -> ()
     {
      return ptr_-> operator ->();
     }

     T& operator * ()
     {
      return ptr_->operator *();
     }

     bool operator == (const CSmartPtr<T>& rt) const
     {
      return ptr_ == rt.get_ptr();
     }

     bool operator == (T* pt) const
     {
      if (pt == NULL)
      {
       return ptr_ == NULL;
      }
      return *ptr_ == pt;
     }

     T* get() const
     {
      if (ptr_ == NULL)
      {
       return NULL;
      }
      return ptr_->get();
     }

     void release()
     {
      if (ptr_ != NULL)
      {
       --(*ptr_);
       ptr_ = NULL;
      }
     }

     void reset(T* pt)
     {
      if (ptr_ != NULL)
      {
       --(*ptr_);
       ptr_ = NULL;
      }

      ptr_ = new CSmartPtr<T>(pt);
     }

     inline bool IsNull() const {return ptr_ == NULL;}

    private:
     CSmartPtr<T>* get_ptr() const {return ptr_;}
     PtrData<T>* ptr_;
    };

  • 相关阅读:
    qt中qmake的详解
    教程:从零开始 使用Python进行深度学习!
    win10系统下搭建Python开发环境和TensorFlow深度学习环境(CPU版)
    怎么选择视觉光源颜色
    pycharm安装及设置中文
    新建DataSet和DataTable,并从中提取数据到文本
    网站服务基础面试
    TCP、UDP数据包大小的限制
    TCP的三次握手与四次挥手理解及面试题(很全面)
    zabbix服务深入
  • 原文地址:https://www.cnblogs.com/kex1n/p/2286425.html
Copyright © 2011-2022 走看看