C++写的一个智能指针类

C++里有一个智能指针类,不过那个类没有计数功能,下面智能指针类可以计数,直到计数为0才能删掉,此类还可以对数组进行管理,也许对你有用呢!

 

/****************************************************
**  Copyright (C) 2006 - 2007
** 功    能: 采用模板实现一个智能化的记数指针
**    指针可以初始化为空,但此时调用
**    指针操作符会抛出异常,而且指针只能初始化一遍
**    如果采用相同的new 生成对象初始化不同SmartPointer
**    这也导致抛出异常,因为这样一来后一个指针将会
**    指向一个无效区域

** 文件名称:  SmartPointer.h
** 文件基类: 
** 扩 展 名: .h
** 创建日期: 2006-04-01
** 作    者: Rohna.w
*****************************************************/

#ifndef  _SMART_POINTER_ONCE_
#define  _SMART_POINTER_ONCE_

template <class T>
class SmartPtr
{
public:
 /********************************************
 * 功  能:默认构造函数
 * 参  数:无
 * 返回值:无
 *********************************************/
 explicit SmartPtr() : smtPtr(0),lCount(0),lDims(0)
 {
 }

 explicit SmartPtr(T *ptr) : smtPtr(ptr),lDims(0)
 {
  if(ptr != NULL)
  {
   lCount = new long(1);
  } 
 }

 explicit SmartPtr(T *ptr,long dims)// : lCount(new long(1)),smtPtr(ptr),lDims(dims)
 {
  if(ptr != NULL && dims > 0)
  {
   smtPtr = ptr;
   lCount = new long(1);
   lDims = dims;
  }
 }

 SmartPtr(const SmartPtr<T> &ptr)
 {
  smtPtr = ptr.smtPtr;
  lCount = ptr.lCount;
  lDims = ptr.lDims;
  
  // 防止赋空指针
  if(smtPtr)
  {
   (*lCount)++;
  }
 }

 SmartPtr<T>& operator=(const SmartPtr<T> &ptr)
 {
  if(this != &ptr)
  {
   Destroy();
   smtPtr = ptr.smtPtr;
   lCount = ptr.lCount;
   lDims = ptr.lDims;
   
   // 防止赋空指针
   if(smtPtr)
   {
    (*lCount)++;
   }
  }
  return *this;
 }

 bool Attach(T *ptr,long dims=0)
 {
  if(ptr != smtPtr)
  {
   Destroy();
   lCount = new long(1);
   smtPtr = ptr;
   lDims = dims;
   ptr = 0;
  }
  return true;
 }

 long Dimension() const
 {
  return lDims;
 }

 T const* GetData() const
 {
  return (T const*)smtPtr;
 }

 T& operator [] (int nIndex) const
 {
  if(nIndex < 0 || nIndex >= lDims) throw;
  return smtPtr[nIndex];
 }

 bool operator == (const SmartPtr<T> &ptr) const
 {
  return ptr.smtPtr == this->smtPtr;
 }

 bool operator < (const SmartPtr<T> &ptr) const
 {
  return this->smtPtr < ptr.smtPtr;
 }

 bool operator ! () const
 {
  if(smtPtr == 0)
  {
   return true;
  }
  return false;
 }

 operator T* () const
 {
  return smtPtr;
 }

 T& operator * () const
 {
  return *smtPtr;
 }

 T* operator -> () const
 {
  return smtPtr;
 }

 virtual ~SmartPtr()
 {
  Destroy();
 }

private:
 void Destroy()
 { 
  if(smtPtr == 0)
  {
   lCount = NULL;
   lDims = 0;
   return;
  }
 
  (*lCount)--;
  
  if(0 == *lCount)
  {
   if(lDims > 0) delete[] smtPtr;
   else delete smtPtr;
   delete lCount;
  }

  smtPtr = NULL;
  lDims = 0;
  lCount = NULL;
 }

private: 
 long *lCount; // 被管理指针的引用计数,为0时释放掉指针
 T  *smtPtr; // 管理的指针
 long lDims;  // 数组元素个数
};
#endif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值