TO 蕾:实际上智能指针,不定参,模板这些东西没有你想象中的那么难……简化一下是否清晰很多:)一起慢慢加油吧。

//=======SmartPiont.h=======

//-----------------------------------------------------------------------------
// Name:    FKSmartPointer
// Author:    FreeKnightDuzhi
// LastModified: 2008_10_12
// Description:   智能指针是预防内存泄露的好东西,因为它会自动的在指针被释放时将其指向的内存空间释放。
//      这里将它实现为模版类,在它出了自己的生命空间后它会自动释放对象类。当一个智能指针被
//      分配了两次内存时候它也会自动的释放第一次分配的内存空间。
//      这里:ISmartPointer基类是一个仅支持基本类型的智能指针,且不支持 "->" 操作符。
//       但CSmartPointer可以支持非基本类型,且重载了 "->" 操作符。
//-----------------------------------------------------------------------------
#pragma once


   template < typename T >
   class ISmartPointer
   {
   public:
    // 构造函数
    ISmartPointer( T* p_pPtr = NULL )
     : m_pPtr ( p_pPtr )
    {

    }

    // 析构函数
    virtual ~ISmartPointer( )
    {
     if ( NULL != m_pPtr )
     {
      delete m_pPtr;
     }
     m_pPtr = NULL;
    }

    // 重载指针符
    T& operator* () const
    {
     return *m_pPtr;
    }

    // 重载普通赋值函数,此次重载是将普通指针转换为智能指针
    T* operator= ( T* p_pPtr )
    {
     // 若是第二次分配空间,则删除第一次的空间分配
     if ( m_pPtr != NULL )
     {
      delete m_pPtr;
     }

     m_pPtr = p_pPtr;
     return m_pPtr;
    }
   private:
    // 拷贝构造函数:不希望外部调用
    ISmartPointer( ISmartPointer< T >& p_Other )
    {
    
    }
   protected:
    T* m_pPtr;
   };

   template < typename T >
   class CSmartPointer : public ISmartPointer < T >
   {
   public:
    // 构造函数
    CSmartPointer( T* p_pPtr = NULL )
     : ISmartPointer < T > ( p_pPtr )
    {

    }

    // 重载 = 号
    T* operator= ( T* p_pPtr )
    {
     return ISmartPointer< T >::operator = ( p_pPtr );
    }

    CSmartPointer< T >& operator= ( CSmartPointer< T >& p_Other )
    {
     return *this;
    }

    // 重载 -> 号
    T* operator->() const
    {
     return m_pPtr;
    }
   private:
    // 拷贝构造函数:不希望外部调用
    CSmartPointer( CSmartPointer< T >& p_Other )
    {
    
    }
   };
  
  
//=======TestSmartPiont.cpp=======

#include <iostream>
using namespace std;

#include "smartPointer.h"

// 测试类..
class CTestClass
{
public:

    int   m_nSomeInt;
    float m_fSomeFloat;
};

void main()
{
    ISmartPointer< int > pIntPtr;
    pIntPtr = new int;
    *pIntPtr = 100;
    cout << *pIntPtr << endl;

    CSmartPointer< CTestClass > pClassPtr1;
    pClassPtr1 = new CTestClass;
    pClassPtr1->m_fSomeFloat = 1.002;
    cout << (*pClassPtr1).m_fSomeFloat << endl;
    cout << pClassPtr1->m_fSomeFloat << endl;
    getchar();
}