一个C++智能指针的实现

#pragma  once
#include <iostream>
#include <vector>
using namespace std;


#define  SAFE_DELETE(x)  do{delete x; x=NULL;}while(0)
class Meter
{
public:
    int _reference;
    Meter()
    {
        _reference = 0;
    }
};

template<typename T >
class sp
{

public:
    Meter*  _meter;
    T*		_raw;
    sp() : _meter (NULL), _raw (NULL)
    {
    }
    sp (T* t)
    {
        _meter = new Meter;
        this->_raw = t;
        _meter->_reference = 1;  //self
    }

    sp (const sp & s)
    {
        _meter = s._meter;
        ++ (s._meter->_reference);
        _raw = s._raw;
    }
    template<typename S>
    sp (const sp<S>& s)
    {
        _meter = s._meter;
        ++ (s._meter->_reference);
        _raw =dynamic_cast<T*> ( s._raw);
    }

    ~sp()
    {
        if (_meter)
            -- (_meter->_reference);
        if (_meter &&  _meter->_reference == 0)
        {
            SAFE_DELETE (_raw);
            SAFE_DELETE (_meter);
        }
    }

    sp & operator= (sp & sp_)
    {
        if (_raw == sp_._raw) return *this;
        _raw = sp_._raw;
        _meter = sp_._meter;
        ++_meter->_reference;
        return *this;
    }

    template< typename S >
    sp<T>& operator= (sp<S>& sp_)
    {
        if (_raw == sp_._raw) return *this;
        _raw = dynamic_cast<T*> (sp_._raw);
        _meter = sp_._meter;
        ++_meter->_reference;
        return *this;
    }
    T* operator*()
    {
        return this;
    }
    T* operator->()
    {
        return _raw;
    }
    operator bool()
    {
        return _raw != NULL;
    }
    bool operator== (sp& sp_)
    {
        return _raw == sp_._raw;
    }
    int use_count() const
    {
        if (_meter) return _meter->_reference;
        return 0;
    }

};


class baseA
{
public:
    virtual ~baseA()
    {
        cout<<"de BaseA";
    }
};
class A :public baseA
{
public:
    int data;
    A (int d) :data (d) {}
    ~A()
    {
        cout <<data <<  " de A "<<endl;
    }
};
sp<baseA > func1()
{
    return  sp<A> (new A (1));
}
sp<A > func2()
{
    sp<A>  a = sp<A> (new A (2));
    return  a;
}


int main ( )
{
    vector<sp<baseA> > bs;
    bs.resize (2);
    bs[0] = func2();
    bs[1]=func1();
    sp<A>  c = bs[0];
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值