//-------Array.h------
#include <stdexcept>
using namespace std;
template<class T>
class Array
{
protected:
T *data;
unsigned int base;
unsigned int length;
public:
Array();
Array(unsigned int, unsigned int = 0);
~Array();
Array(Array const&);
Array &operator = (Array const&);
T const& operator [] (unsigned int) const;
T& operator [] (unsigned int);
T const* Data()const;
unsigned int Base() const;
unsigned int Length() const;
void SetVal(unsigned int, T);
void SetBase(unsigned int);
void SetLength(unsigned int);
};
//-------Array.cpp------
#include "stdafx.h"
#include "Array.h"
template <class T>
Array<T>::Array() :
data( new T[0] ),
base(0),
length(0)
{}
template <class T>
Array<T>::Array(unsigned int n, unsigned int m) :
data(new T[n]),
base(m),
lengtn(n)
{}
template <class T>
Array<T>::Array(Array<T> const& array) :
data(new T[array.length]),
base(array.base),
length(array.length)
{
for(unsigned int i = 0; i < length; ++i)
data[i] = array.data[i];
}
template <class T>
Array<T> &Array<T>::operator = (Array<T> const& array) :
data(new T[array.length]),
base(array.base),
length(array.length)
{
for(unsigned int i = 0; i < length; ++i)
data[i] = array.data[i];
return *this;
}
template <class T>
Array<T>::~Array()
{ delete []data; }
//提供只读功能,被称为“成员变量存取器”
template <class T>
T const* Array<T>::Data() const
{ return data; }
template <class T>
unsigned int Array<T>::Base() const
{ return base; }
template<class T>
unsigned int Array<T>::Length() const
{ return length; }
//数组下标操作符,提供数组越界检测。有两种重载形式:
//一种对const型数组对象进行操作;另一种对非const型数组对象进行操作
template <class T>
T const& Array<T>::operator [] (unsigned int i) const
{
unsigned int const offset = i + base;
if(offset >= length)
throw out_of_range("invalid positon!");
return data[offset];
}
template <class T>
T& Array<T>::operator [] (unsigned int i)
{
unsigned int const offset = i + base;
if(offset >= length)
throw out_of_range("invalid positon!");
return data[offset];
}
//数组的重调函数,包括基地址的重调和大小重调
template <class T>
void Array<T>::SetBase(unsigned int newBase)
{
if(newBase > length)
throw out_of_range("The new base address can't be larger than total length!");
base = newBase;
}
template <class T>
void Array<T>::SetLength(unsigned int newLen)
{
T* const newdata = new T[newLen];
unsigned int const min =
length < newLen ? length : newLen;
for(unsigned int i = 0; i < min; ++i)
newdata[i] = data[i];
delete []data;
data = newdata;
length = newLen;
}
//赋值函数
template <class T>
void Array<T>::SetVal(unsigned int indx, T val)
{
unsigned int const offset = indx + base;
if(offset >= length)
throw out_of_range("invalid positon!");
data[offset] = val;
}
//-------main---------
#include "stdafx.h"
#include "Array.h"
#include <iostream>
#include <stdexcept>
using namespace std;
int main(int argc, char* argv[])
{
Array<int> ia, ib(0,10);
for(int i = 0; i < ib.Length(); i++)
ib.SetVal(i,i);
ia = ib;
const Array<int> ic(ib);
for(i = 0; i<ia.Length(); ++i)
cout<<ia[i]<<'\t';
cout<<endl;
for(i = 0; i<ic.Length(); ++i)
cout<<ic[i]<<'\t';
cout<<endl;
return 0;
}
错误提示:
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::~Array<int>(void)" (??1?$Array@H@@QAE@XZ)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: int const & __thiscall Array<int>::operator[](unsigned int)const " (??A?$Array@H@@QBEABHI@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: int & __thiscall Array<int>::operator[](unsigned int)" (??A?$Array@H@@QAEAAHI@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(class Array<int> const &)" (??0?$Array@H@@QAE@ABV0@@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: class Array<int> & __thiscall Array<int>::operator=(class Array<int> const &)" (??4?$Array@H@@QAEAAV0@ABV0@@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: void __thiscall Array<int>::SetVal(unsigned int,int)" (?SetVal@?$Array@H@@QAEXIH@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: unsigned int __thiscall Array<int>::Length(void)const " (?Length@?$Array@H@@QBEIXZ)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(unsigned int,unsigned int)" (??0?$Array@H@@QAE@II@Z)
DynamicArray.obj : error LNK2001: unresolved external symbol "public: __thiscall Array<int>::Array<int>(void)" (??0?$Array@H@@QAE@XZ)
Debug/DynamicArray.exe : fatal error LNK1120: 9 unresolved externals