关键词:Pointer
类的实现、重构SmartPointer
类
思考:使用智能指针(Smart Pointer)替换单链表(LinkList)中的原生指针是否可行?
由于智能指针在一片堆空间中最多只能有一个指针标识,而在LinkList中一个node可能需要多个指针表示,违背了智能指针的设计原则,因此不能用智能指针代替LinkList中的原生指针,需要设计一种新的指针类——SharedPointer。
0. 新的设计方案
类图如下所示:
智能指针类
- Pointer是智能指针的抽象父类(模板类)
纯虚析构函数virtual ~Pointer() = 0
重载operator->()
重载operator*()
#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
网友评论