지능 포인터 의 실현(스 레 드 안전 을 고려 하지 않 음)

http://blog.csdn.net/lmsnju/article/details/4734840
#include 
#include 
using namespace std;

template
class SmartPtr
{
public:
    SmartPtr(T *p = 0):ptr(p),pUse(new size_t(1)){

    }
    SmartPtr(const SmartPtr &src):pUse(src.pUse),ptr(src.ptr)
    {
        ++*pUse;  //    +1,             
    }
    SmartPtr& operator=(const SmartPtr &rhs) //  
    {
            ++ *rhs.pUse;//        
            decrUse();
            ptr = rhs.ptr;
            pUse = rhs.pUse; //       
            return *this ;
    }
    T *operator->(){
        if(ptr)
            return ptr;
        throw std::runtime_error("access NULL");
    }
    const T *operator->() const {
        if (ptr)
            return ptr;
        throw std::runtime_error("access NULL");
    }
    T &operator*(){
        if(ptr)
            return *ptr;
        throw std::runtime_error("derefferences of NULL");
    }
    const T &operator*() const{
        if(ptr)
            return *ptr;
        throw  std:: runtime_error("dereferece of NULL");
    }

    ~SmartPtr(){
        decUse();
    }
private:
    void decUse(){
        if(--*pUse == 0)
        {
            delete ptr;
            delete pUse;
        }
    }
    T  *ptr;
    size_t *pUse;
};

class Data{
public:
    Data(){
        cout< t;
        t->print();
    }catch(const exception & err){
        cout< t(new Data);
    return 0;

}

좋은 웹페이지 즐겨찾기