27_再论智能指针

2018-07-08  本文已影响6人  编程半岛

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

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

0. 新的设计方案

类图如下所示:


智能指针类

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

上一篇 下一篇

猜你喜欢

热点阅读