美文网首页
27_再论智能指针

27_再论智能指针

作者: 编程半岛 | 来源:发表于2018-07-08 18:30 被阅读6次

    关键词:Pointer类的实现、重构SmartPointer

    思考:使用智能指针(Smart Pointer)替换单链表(LinkList)中的原生指针是否可行?
    由于智能指针在一片堆空间中最多只能有一个指针标识,而在LinkList中一个node可能需要多个指针表示,违背了智能指针的设计原则,因此不能用智能指针代替LinkList中的原生指针,需要设计一种新的指针类——SharedPointer

    0. 新的设计方案

    类图如下所示:


    智能指针类
    • Pointer是智能指针的抽象父类(模板类)
      纯虚析构函数virtual ~Pointer() = 0
      重载operator->()
      重载operator*()

    Pointer.h

    #ifndef POINTER_H
    #define POINTER_H
    
    #include "Object.h"
    
    namespace DTLib
    {
    
    template < typename T >
    class Pointer : public Object
    {
    protected:
        T* m_pointer;
    public:
        Pointer(T* p = NULL);
        T* operator-> ();
        T* operator* ();
        bool isNull();
        T* get();
    };
    
    Pointer<T>::Pointer(T* p = NULL)
    {
        m_pointer = p;
    }
    
    T* Pointer<T>::operator-> ()
    {
        return m_pointer;
    }
    
    T* Pointer<T>::operator* ()
    {
        return *m_pointer;
    }
    
    bool Pointer<T>::isNull()
    {
        return (m_pointer == NULL);
    }
    
    T* Pointer<T>::get()
    {
        return m_pointer;
    }
    
    }
    
    #endif // POINTER_H
    

    重构后的SmartPointer.h

    #ifndef SMARTPOINTER_H
    #define SMARTPOINTER_H
    
    #include "Pointer.h"
    
    namespace DTLib
    {
    template < typename T >
    class SmartPointer : public Pointer<T>
    {
    public:
        SmartPointer(T* p = NULL);
        SmartPointer(const SmartPointer<T>& obj);
        SmartPointer<T>& operator= (const SmartPointer<T>& obj);
        ~SmartPointer();
    };
    
    template < typename T >
    SmartPointer<T>::SmartPointer(T* p) : Pointer<T>(p)
    {
    
    }
    
    /* 拷贝构造函数:一片堆空间最多由智能一个指针标识,防止堆空间重复释放 */
    template < typename T >
    SmartPointer<T>::SmartPointer(const SmartPointer<T>& obj)
    {
        this->m_pointer = obj.m_pointer;           // 将当前对象的指针指向obj对象指针
    
        /* 为了将一片堆空间最多由一个智能指针标识,需要将obj.m_pointer置空 */
        const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
    }
    
    /* 重载赋值操作符:一片堆空间最多由智能一个指针标识,防止堆空间重复释放 */
    template < typename T >
    SmartPointer<T>& SmartPointer<T>::operator= (const SmartPointer<T>& obj)
    {
        if( this != &obj )  // 排除自赋值
        {
            /* 先创建一个指针指向*this中的pointer,
               然后将obj中的pointer赋值给*this的pointer,
               然后将obj中的pointer置为NULL,
               删除临时指针p(保证类异常安全)*/
            T* p = this->m_pointer;
            this->m_pointer = obj.m_pointer;
            const_cast<SmartPointer<T>&>(obj).m_pointer = NULL;
    
            delete p;
        }
    
        return *this;
    }
    
    template < typename T>
    SmartPointer<T>::~SmartPointer()
    {
        delete this->m_pointer;
    }
    
    }
    
    #endif // SMARTPOINTER_H
    

    声明:此文章仅是本人在学习狄泰学院《数据结构实战开发教程》所做的笔记,文章中包含狄泰软件资料内容,一切版权归狄泰软件所有!
    实验环境:ubuntu10 + Qt Creator2.4.1 + Qt SDK 4.7.4

    相关文章

      网友评论

          本文标题:27_再论智能指针

          本文链接:https://www.haomeiwen.com/subject/bxuiaxtx.html