对象池


smartpoint


#ifndef __SMART_POINTER_H__
#define __SMART_POINTER_H__

template <class T>
class SmartPointer
{
public:
    typedef T element_type;

    SmartPointer ():_object(NULL), _counter(NULL){}
    SmartPointer(T * object):_object(NULL), _counter(NULL){ Assign(object); }
    SmartPointer(const SmartPointer& sp):_object(NULL), _counter(NULL){ Assign(sp); }
    SmartPointer& operator=(T * object) { Assign(object); return *this; }
    SmartPointer& operator=(const SmartPointer& sp) { Assign(sp); return *this; }
    
    ~SmartPointer() { if (_counter) RemRef(); }
    
    bool operator == (const SmartPointer& sp) { assert(_object != NULL); return ( Get() == sp.Get()); }
    bool operator != (const SmartPointer& sp) { assert(_object != NULL); return ( Get() != sp.Get()); }
    bool operator < (const SmartPointer& sp)  { assert(_object != NULL); return ( Get() > sp.Get()); }
    bool operator()(){ return (_object != NULL); }
    bool operator!() { return (_object == NULL); }
    
    T* operator ->() { assert(_object != NULL); return _object; }
    T& operator * () { assert(_object != NULL); return *_object; }
    const T* operator->() const { assert(_object != NULL); return _object; }
    const T& operator *() const { assert(_object != NULL); return *_object; }
        
    T* Get() const { return _object; }
    int GetCounter() const { return _counter ? *_counter : 0 ?}
    bool Unique() const { return _counter ? (*_counter == 1) : false;}
    
    void Reset(T* object = NULL)
    {
        Assign(object);
    }
    
protected:
    void Assign(T* object)
    {
        if ( _object )
        {
            RemRef();
        }
        
        if ( object )
        {
            try
            {
                _counter = new int;
                AddRef();
            }
            catch ( ... )
            {
                delete object;
                object = NULL;
            }
            
            _object = object;
        }
    }
    
    void Assign(const SmartPointer& sp)
    {
        T* object = sp._object;
        if ( _object != object )
        {
            if ( _counter )
            {
                RemRef();
            }
            _counter = sp._counter;
            _object = sp._object;
            AddRef();
        }
    }
    
    void RemRef()
    {
        assert(_object);
        assert(_counter);
        
        if ( *_counter > 0 && --*_counter == 0 )
        {
            delete _object;
            delete _counter;
        }
        
        _object = NULL;
        _counter = NULL;
    }
    
    void AddRef()
    {
        assert(_counter);
        *_counter++;
    }

private:
    T*      _object;
    int*    _counter;
};



#endif//__SMART_POINTER_H__



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值