一个自己实现的简单的智能指针模板类

33 篇文章 5 订阅

一个智能指针的小程序,使用模板函数开发,附带测试程序

代码如下:

///auto ptr

template<typename T>
class AutoPtr
{
    struct t_ptr
    {
        T* __ptr;
        int __counter;

        t_ptr(T*ptr)
        {
            __ptr = ptr;
            __counter = 1; 
        };
        t_ptr(){__ptr = NULL;__counter = 0;}
        ~t_ptr(){delete __ptr;}
    };

private:
    t_ptr* m_ptr;

public:
    AutoPtr();
    AutoPtr(T* ptr = NULL);
    AutoPtr(const AutoPtr& rhs); 
    AutoPtr<T>& operator=(const AutoPtr<T>& rhs);
    T& operator*();
    T*operator->();
    ~AutoPtr();
private:
    void _AddRef();
    void _DeRef();
};
defination of AutoPtr
//构造函数
template<typename T>
AutoPtr<T>::AutoPtr(T* ptr)
{
    m_ptr = new t_ptr(ptr);
}

//构造函数
template<typename T>
AutoPtr<T>::AutoPtr()
{
    m_ptr = new t_ptr();
}

//拷贝构造函数
template<typename T>
AutoPtr<T>::AutoPtr(const AutoPtr& rhs):m_ptr(rhs.m_ptr)
{
   _AddRef(); 
}
//赋值操作
template<typename T>
AutoPtr<T>& AutoPtr<T>::operator=(const AutoPtr<T>& rhs) 
{
    if(m_ptr != rhs.m_ptr)
    {
        if(NULL != m_ptr)//将要接受新指针,需要将原来的引用计数减掉。
            --m_ptr->__counter;
        m_ptr = rhs.m_ptr;
        _AddRef();       
    }
}
//析构函数
template<typename T>
AutoPtr<T>::~AutoPtr()
{
    _DeRef();
}
/
template<typename T>
T& AutoPtr<T>::operator*()
{
    return *m_ptr->__ptr;
}

template<typename T>
T* AutoPtr<T>::operator->()
{
    return m_ptr->__ptr;
}



/计数器增减操作//
template<typename T>
void AutoPtr<T>::_AddRef()
{
    if(NULL != m_ptr)
        ++m_ptr->__counter;
}

template<typename T>
void AutoPtr<T>::_DeRef()
{
    if(NULL == m_ptr)
        return ;

    --m_ptr->__counter;
    if(m_ptr->__counter <= 0)
        delete m_ptr;
}


//test

//testmain.cpp
#include<iostream>
#include "AutoPtr.h"
using namespace std;

class TestClass
{
    int m_iCounter;
public:
    int Get(){return m_iCounter;}
    void Set(int iVal){m_iCounter = iVal;}
};

using namespace std;
int main()
{
    AutoPtr<TestClass> ap(new TestClass);
    ap->Set(200);
    cout<<"ap->Get():"<<ap->Get()<<endl;
    AutoPtr<TestClass>ap2 = ap;
    cout<<"ap2->Get():"<<ap2->Get()<<endl;

    ap2->Set(600);
    cout<<"after ap->Get():"<<ap->Get()<<endl;
    cout<<"after ap2->Get():"<<ap2->Get()<<endl;
    
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值