Reference: Data Structures and Algorithms with Object-Oriented Design Patterns in C++
#include <iostream> #include <stdexcept> // std::out_of_range 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 SetBase(unsigned int); void SetLength(unsigned int); }; 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; length = 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() { 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; } template <class T> T const& Array<T>::operator [] (unsigned int position) const { unsigned int const offset = position - base; if(offset >= length) throw out_of_range("invalid position"); return data[offset]; } template <class T> T& Array<T>::operator [] (unsigned int position) { unsigned int const offset = position - base; if(offset >= length) throw out_of_range("invalid position"); return data[offset]; } template <class T> void Array<T>::SetBase(unsigned int newBase) { base = newBase; } template <class T> void Array<T>::SetLength(unsigned int newLength) { T* const newData = new T[newLength]; unsigned int const min = length < newLength ? length : newLength; for(unsigned int i = 0; i<min; i++) newData[i] = data[i]; delete [] data; data = newData; length = newLength; } int main() { Array<int> array(5,0); array[0] = 10; array[1] = 20; return 0; }