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

来源:互联网 发布:linux 安装svn客户端 编辑:程序博客网 时间:2024/05/16 02:10

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

代码如下:

///////////////////////////////////////////////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;}