///////////////////////////////////////////////// // MT1Q5.cpp - Bounds Checking template Policy // // // // Jim Fawcett, CSE687 - Midterm, Spring 2010 // ///////////////////////////////////////////////// #include #include class NoBoundsCheck { public: template static void range_of(size_t i) {} }; class BoundsCheck { public: template static void range_of(size_t i) { if(i<0 || N<= i) throw std::exception("range error"); } }; template class Array { public: Array(); Array(const Array& a); ~Array(); Array& operator=(const Array& a); T& operator[](size_t n); T operator[](size_t n) const; private: T* array_; }; template Array::Array() : array_(new T[N]) {} template Array::Array(const Array& a) : array_(new T[N]) { for(size_t i=0; i Array::~Array() { delete [] array_; } template Array& Array::operator=(const Array& a) { if(this == &a) return *this; delete [] array_; array_ = new T[N]; for(size_t i=0; i T& Array::operator [](size_t n) { Check::range_of(n); return array_[n]; } template T Array::operator [](size_t n) const { Check::range_of(n); return array_[n]; } void main() { std::cout << "\n MT1Q5 - Bounds Checking Template Policy"; std::cout << "\n =========================================\n"; try { // if you replace BoundsCheck with NoBoundsCheck // a heap corruption Assert is thrown Array arr; for(size_t i=0; i<4; ++i) arr[i] = i + 0.5; std::cout << "\n "; for(size_t i=0; i<4; ++i) std::cout << arr[i] << " "; arr[-1] = arr[5]; std::cout << "\n\n"; } catch(std::exception& ex) { std::cout << "\n\n " << ex.what() << "\n\n"; } }