智能指针的用法1


#include <iostream>
#include <stdexcept>
using namespace std;
#define TEST_SMARTPTR
class Stub
{
public:
 void print() {
  cout<<"Stub: print"<<endl;
 }
 ~Stub(){
  cout<<"Stub: Destructor"<<endl;
 }
};

template <typename T>
class SmartPtr
{
public:
 SmartPtr(T *p = 0): ptr(p), pUse(new size_t(1)) { }
 SmartPtr(const SmartPtr& src): ptr(src.ptr), pUse(src.pUse) {
  ++*pUse;
 }
 SmartPtr& operator= (const SmartPtr& rhs) {
  // self-assigning is also right
  ++*rhs.pUse;
  decrUse();
  ptr = rhs.ptr;
  pUse = rhs.pUse;
  return *this;
 }
 T *operator->() {
  if (ptr)
  return ptr;
  throw std::runtime_error("access through NULL pointer");
 }
 const T *operator->() const {
  if (ptr)
   return ptr;
  throw std::runtime_error("access through NULL pointer");
 }
 T &operator*() {
  if (ptr)
   return *ptr;
  throw std::runtime_error("dereference of NULL pointer");
 }
 const T &operator*() const {
  if (ptr)
   return *ptr;
  throw std::runtime_error("dereference of NULL pointer");
 }
 ~SmartPtr() {
  decrUse();
 #ifdef TEST_SMARTPTR
  std::cout<<"SmartPtr: Destructor"<<std::endl;// for testing
 #endif
 }
 private:
 void decrUse() {
  if (--*pUse == 0) {
   delete ptr;
   delete pUse;
  }
 }
 T *ptr;
 size_t *pUse;
};

int main()
{
 try {
  SmartPtr<Stub> t;
  t->print();
 } catch (const exception& err) {
  cout<<err.what()<<endl;
 }
 SmartPtr<Stub> t1(new Stub);
 SmartPtr<Stub> t2(t1);
 SmartPtr<Stub> t3(new Stub);
 t3 = t2;
 t1->print();
 (*t3).print();
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值