类模板

115 阅读1分钟

需求:
写一个可变长度的数组类Array
用途于存放若干元素,个数未知
设计:
内部动态申请一个buffer
capacity:表示buffer的大小
size:表示buffer中已经存放元素的个数

class Array
{
    public:
        Array(int capacity=16)
        {
            m_buffer=new double[capacity];
            m_capacity=capacity;
            m_size=0;
        }
        void PushBack(double val)
        {
            if(m_size >=m_capacity)
            {
                Resize();
            }
            m_buffer[m_size]=val;
            m_size++;
        }
        int Capacity()
        {
            return m_capacity;
        }
    private:
        void Resize()
        {
            //创建一个更大的缓冲区
            int n=m_capacity + 16;
            double *buf=new double[n];
            //拷贝原有的内容
            memcpy(buf,m_buffer,m_capacity);
            //删除旧的内容,释放其内容
            delete [] m_buffer;
            //更新一下成员变量
            m_capacity=n;
            m_buffer=buf;

        }
    private:
        double * m_buffer;
        int m_capacity;//容量
        int m_size;//已经存放的对象的个数
};
int main()
{
    Array a;
    a.PushBack(1);
    a.PushBack(2);
    a.PushBack(3);
    a.PushBack(4);
    a.PushBack(5);
}

接口:
Size();得到当前一个有多个元素
Capacity();最大容量
Clear();清空,使size为0,capacity不变
PushBack():附加一个元素
重载操作符():返回第几个元素(像数组一样操作它)
问题:这个类只适用于存放double型元素,如果要存放clear,float,int,以至于任意类型呢?
类模板

template <typename T>
class Array
{
};

使用类模板,就可以适用于不同元素类型,避免创建很多个类型的类。
否则,要为每种类型创建一个类,例如:IntArray,DoubleArray……

使用方法:
Array arr(4);//创建array,初始capacity为4
可以把Array合起来看成一个类名
使用这个对象的方法和普通对象没有特别之处:

arr.PushBack(123);
arr.PushBack(456);
int size=arr.Size();
arr[0]=100;

模板的定义通常放在头文件里面