28_再论智能指针(下)

2018-07-09  本文已影响10人  编程半岛

关键词:SharedPointer类的实现

0. SharedPointer类图

SharedPointer类图

2. SharedPointer设计要点——计数机制

3. SharedPointer类的声明

template < typename T >
class SharedPointer : public Pointer<T>
{
protected:
    int* m_ref;     // 计数机制成员指针
public:
    SharedPointer(T* p = NULL);
    SharedPointer(const SharedPointer<T>& obj);
    SharedPointer<T>& operator= (const SharedPointer<T>& obj);
    void clear();   // 将当前指针置为空
    ~SharedPointer();
};

由于SharedPointer支持多个对象同时指向一片堆空间,因此,必须支持比较操作

4. SharedPointer类的实现

SharedPointer

#ifndef SHAREDPOINTER_H
#define SHAREDPOINTER_H

#include "cstdlib"
#include "Exception.h"
#include "Pointer.h"

namespace DTLib
{

template < typename T >
class SharedPointer : public Pointer<T>
{
protected:
    int* m_ref;     // 计数机制成员指针
    void assign(const SharedPointer<T>& obj);
public:
    SharedPointer(T* p = NULL);
    SharedPointer(const SharedPointer<T>& obj);
    SharedPointer<T>& operator= (const SharedPointer<T>& obj);
    void clear();   // 将当前指针置为空
    ~SharedPointer();
};

template < typename T >
SharedPointer<T>::SharedPointer(T* p) : m_ref(NULL)
{
    if( p )
    {
        this->m_ref = static_cast<int*>(std::malloc(sizeof(int)));   // 给m_ref分配堆内存空间

        if( this->m_ref )
        {
            *(this->m_ref) = 1;     // 申请成功后,计数赋值为1
            this->m_pointer = p;
        }
        else
        {
            THROW_EXCEPTION(NoEnoughMemoryExcetion, "No memory to create SharedPointer object...");
        }
    }
}

template < typename T >
void SharedPointer<T>::assign(const SharedPointer<T>& obj)
{
    this->m_ref = obj.m_ref;
    this->m_pointer = obj.m_pointer;

    if( this->m_ref )
    {
        ++(*this->m_ref);
    }
}

template < typename T >
SharedPointer<T>::SharedPointer(const SharedPointer<T>& obj)
{
    assign(obj);
}

template < typename T >
SharedPointer<T>& SharedPointer<T>::operator= (const SharedPointer<T>& obj)
{
    if( this != &obj)   // 避免自赋值
    {
        clear();

        assign(obj);
    }

    return *this;
}

template < typename T >
void SharedPointer<T>::clear()
{
    T* toDel = this->m_pointer;
    int* ref = this->m_ref;

    this->m_pointer = NULL;
    this->m_ref = NULL;

    if( ret )       // 判断计数变量是否合法
    {
        --(*ref);       // 将计数变量减1

        if( *ref == 0 ) // 判断计数变量是否为0
        {
            free(ref);  //  释放计数变量的堆空间

            delete toDel;   // 销毁堆空间

        }
    }
}

template < typename T >
SharedPointer<T>::~SharedPointer()
{
    clear();
}

/* 通过全局函数重载 == 操作符*/
template < typename T >
bool operator== (const SharedPointer<T>& l, const SharedPointer<T>& r)
{
    return l.get() == r.get();
}

/* 通过全局函数重载 != 操作符*/
template < typename T >
bool operator!= (const SharedPointer<T>& l, const SharedPointer<T>& r)
{
    return !(l == r);
}

}

#endif // SHAREDPOINTER_H

5. 智能指针的使用军规

6. 小结

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

上一篇 下一篇

猜你喜欢

热点阅读