#include #include using namespace std; // All definitions are outside the class template. // For an alternative implementation, see array1d.cpp. template class Array { public: Array(unsigned int n = 0, int b = 0); Array(const Array &a); ~Array(); Array &operator=(const Array &a); const T &operator[](int i) const; T &operator[](int i); protected: T *data; int base; unsigned int length; unsigned int loc(int i) const; }; template Array::Array(unsigned int n, int b) : data(new T[n]), base(b), length(n) {} template Array::Array(const Array &a) : data(new T[a.length]), base(a.base), length(a.length) { for (unsigned int i = 0; i < length; ++i) data[i] = a.data[i]; } template Array::~Array() { delete[] data; } template Array &Array::operator=(const Array &a) { if (&a != this) { delete[] data; base = a.base; length = a.length; data = new T[length]; for (unsigned int i = 0; i < length; ++i) data[i] = a.data[i]; } return *this; } template unsigned int Array::loc(int i) const { const int offset = i - base; if (offset < 0 || offset >= length) throw out_of_range("invalid array index"); return offset; } template T &Array::operator[](int i) { return data[loc(i)]; } template const T &Array::operator[](int i) const { return data[loc(i)]; } int main() { Array a(10, 1); for (int i = 1; i <= 10; ++i) a[i] = i * (i + 1) / 2; Array b; const Array c(a); b = c; a[2] = 17; b[3] = 42; for (int i = 1; i <= 10; ++i) cout << i << ": " << a[i] << " " << b[i] << " " << c[i] << endl; }