#include <assert.h>

template <typename T,int N=1>
class autoPtr{
    T* _pointee;
public:
    autoPtr()
    {
        _pointee = 0;
    }
    explicit autoPtr(T * pointee)
    {
        _pointee = pointee;
    }
    autoPtr(autoPtr<T> &sp)
    {
        _pointee = sp._pointee;
        sp._pointee = 0;
    }
    ~autoPtr()
    {
        delete [] _pointee;
    }
    autoPtr<T>& operator=(autoPtr<T>& sp)
    {
        if(this != &sp)
        {
            if(_pointee)
                delete _pointee;
            _pointee = sp._pointee;
            sp._pointee=0;
        }
        return *this;
    }
    operator bool()const
    {
        return _pointee!=0;
    }
    T& operator*()const
    {
        return *_pointee;
    }
    T* operator->()const
    {
        return _pointee;
    }
    T& operator[](int i)const;
    {
        assert(i<N);
        return *(_pointee+i);
    }
};

template <typename T>
class autoPtr{
    T* _pointee;
public:
    autoPtr()
    {
        _pointee = 0;
    }
    explicit autoPtr(T * pointee)
    {
        _pointee = pointee;
    }
    autoPtr(autoPtr<T> &sp)
    {
        _pointee = sp._pointee;
        sp._pointee = 0;
    }
    ~autoPtr()
    {
        delete _pointee;
    }
    autoPtr<T>& operator=(autoPtr<T>& sp)
    {
        if(this != &sp)
        {
            if(_pointee)
                delete _pointee;
            _pointee = sp._pointee;
            sp._pointee=0;
        }
        return *this;
    }
    operator bool()const
    {
        return _pointee!=0;
    }
    T& operator*()const
    {
        return *_pointee;
    }
    T* operator->()const
    {
        return _pointee;
    }
};

