模版及模版类的继承

关于类模版最好将类声明和实现凡在同一个.h文件中,否则有些编译器不支持导致莫名其妙的编译错误.

 

模版基类:

 

#ifndef PFARRAY_H
#define PFARRAY_H

#include <iostream>

using namespace std;

namespace PFArraySavith
{
  template<typename T> class PFArray
 {
    public:
        PFArray();
       
        PFArray(int capacityValue);

        PFArray(const PFArray<T>& pfaObject);

        void addElement(T element);

        bool full() const;

        int getCapacity() const;

        int getNumberUsed() const;

        void emptyArray();

        T& operator[](int index);

        PFArray<T>& operator =(const PFArray<T>& rightSide);

        virtual ~PFArray();
    private:
        T *a;
        int capacity;
        int used;
 };
 
 
    template<typename T>
    PFArray<T>::PFArray():capacity(50),used(0)
    {
        a = new T[capacity];                                                       
    }
   
    template<typename T>
    PFArray<T>::PFArray(int size):capacity(size),used(0)
    {
        a = new T[capacity];                                                       
    }

    template<typename T>
    PFArray<T>::PFArray(const PFArray<T>& pfaObject):
               capacity(pfaObject.getCapacity),used(pfaObject.getNumberUsed())
    {                   
        a = new T[capacity];
        for (int i = 0; i < used; i++)
        {
            a[i] = pfaObject.a[i];
        }                                                       
    }
   
    template<typename T>
    void PFArray<T>::addElement(T element)
    {
        if (used >= capacity)
        {
            cout<<"已满"<<endl;
            exit(0);
        }
       
        a[used++] = element;
    }
   
    template<typename T>
    bool PFArray<T>::full() const
    {
        return capacity == used;
    }
   
    template<typename T>
    int PFArray<T>::getCapacity() const
    {
        return this->capacity;
    }
   
    template<typename T>
    int PFArray<T>::getNumberUsed() const
    {
        return used;
    }
   
    template<typename T>
    void PFArray<T>::emptyArray()
    {
        used = 0;
    }
   
    template<typename T>
    T& PFArray<T>::operator[](int index)
    {
        if (index >= used)
        {
            cout<<"下标超界"<<endl;
            exit(0);
        }   
        return a[index];
    }
   
    template<typename T>
    PFArray<T>& PFArray<T>::operator =(const PFArray<T>& rightSide)
    {
        if (capacity != rightSide.capacity)
        {
            delete[] a;
            a = new T[rightSide.capacity];
        }
       
        capacity = rightSide.capacity;
        used = rightSide.used;
        for (int i = 0; i < used; i++)
            a[i] = rightSide.a[i];
           
        return *this;                   
    }
     
    template<typename T>
    PFArray<T>::~PFArray()
    {
        delete[] a;
    }
}

#endif

  


 

模版继承类:

 

#ifndef PFARRAYBACK_H
#define PFARRAYBACK_H

 

#include "pfarray.h"

 

namespace PFArraySavith
{
    template<typename T>
    class PFArrayBack : public PFArray<T>
    {
        public:
            PFArrayBack();
           
            PFArrayBack(int capacityValue);
           
            PFArrayBack(const PFArrayBack<T>& object);
           
            void backup();
           
            void restore();
           
            PFArrayBack<T>& operator =(const PFArrayBack<T>& rightSide);
           
            virtual ~PFArrayBack();
           
        private:
            T* b;
            int usedB;
    };
   
    template<typename T>
    PFArrayBack<T>::PFArrayBack() :
                    PFArray<T>(),usedB(0)
    {
        b = new T[getCapacity()];
    }
   
    template<typename T>
    PFArrayBack<T>::PFArrayBack(int capacityValue) :
                    PFArray<T>(capacityValue),usedB(0)
    {
        b = new T[getCapacity()];
    }
   
    template<typename T>
    PFArrayBack<T>::PFArrayBack(const PFArrayBack& object) :
                    PFArray<T>(object),usedB(0)
    {
        b = new T[getCapacity()];
        usedB = object.getNumberUsed();
        for (int i = 0; i < usedB; i ++)
        {
            b[i] = object.b[i];
        }
    }
   
    template<typename T>
    void PFArrayBack<T>::backup()
    {
        usedB = getNumberUsed();
        for (int i = 0; i < usedB; i++)
            b[i] = operator[](i);
    }
   
    template<typename T>
    void PFArrayBack<T>::restore()
    {
        PFArray::emptyArray();
       
        for (int i = 0; i < usedB; i++)
        {
            addElement(b[i]);
        }
    }
   
    template<typename T>
    PFArrayBack<T>& PFArrayBack<T>::operator =(const PFArrayBack<T>& rightSide)
    {
        PFArray<T>::operator =(rightSide);
       
        if (getCapacity() != rightSide.getCapacity())
        {
            delete[] b;
            b = new T[rightSide.getCapacity()];
        }
       
        usedB = rightSide.usedB;
        for (int i = 0; i < usedB; i++)
            b[i] = rightSide.b[i];
           
        return *this;
    }
   
    template<typename T>
    PFArrayBack<T>::~PFArrayBack()
    {
        delete[] b;
    }
}

#endif

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值