#include <iostream> #include <stdexcept> using namespace std; class CheckedPtr{ public: CheckedPtr(int *b,int *e,int *c): beg(b),end(e),curr(c){ } CheckedPtr(const CheckedPtr &obj): //复制构造函数 beg(obj.beg),end(obj.end),curr(obj.curr){ } CheckedPtr& operator++(); //prefix operators CheckedPtr& operator--(); //prefix operators CheckedPtr& operator++(int); //postfix operators CheckedPtr& operator--(int); //postfix operators int& operator[](const size_t); //重载下标运算符 const int& operator[](const size_t) const; int& operator*(); //重载解解引用操作符 const int& operator*() const; friend bool operator==(const CheckedPtr&,const CheckedPtr&); //重载=运算符 friend bool operator!=(const CheckedPtr&,const CheckedPtr&); //重载!=运算符 friend bool operator<(const CheckedPtr&,const CheckedPtr&); //重载<运算符 friend bool operator>(const CheckedPtr&,const CheckedPtr&); //重载>运算符 friend bool operator<=(const CheckedPtr&,const CheckedPtr&); //重载<=运算符 friend bool operator>=(const CheckedPtr&,const CheckedPtr&); //重载>=运算符 friend CheckedPtr operator+(const CheckedPtr&,const size_t); //重载+运算符 friend CheckedPtr operator-(const CheckedPtr&,const size_t); //重载-运算符 private: int *beg; int *end; int *curr; }; CheckedPtr& CheckedPtr::operator++(){ if(curr==end) throw out_of_range("increment past the end of CheckedPtr"); ++curr; return *this; } CheckedPtr& CheckedPtr::operator--(){ if(curr==beg) throw out_of_range("decrement past the beginning of CheckedPtr"); --curr; return *this; } CheckedPtr& CheckedPtr::operator++(int){ CheckedPtr ret(*this); ++*this; return ret; } CheckedPtr& CheckedPtr::operator--(int){ CheckedPtr ret(*this); --*this; return ret; } /*习题14.23*/ int& CheckedPtr::operator[](const size_t index){ if(index+beg>=end||index+beg<beg) //此处的end指向数组最后一个元素的下一个位置,所以有等号 throw out_of_range("invalid index"); return *(beg+index); } const int& CheckedPtr::operator[](const size_t index) const{ if(index+beg>=end||index+beg<beg) throw out_of_range("invalid index"); return *(beg+index); } int& CheckedPtr::operator*(){ if(curr==end) throw out_of_range("invalid current pointer*"); return *curr; } const int& CheckedPtr::operator*() const{ if(curr==end) throw out_of_range("invalid current pointer*"); return *curr; } /*习题14.25*/ bool operator==(const CheckedPtr &obj1,const CheckedPtr &obj2){ return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr==obj2.curr; } bool operator!=(const CheckedPtr &obj1,CheckedPtr &obj2){ return !(obj1==obj2); } bool operator<(const CheckedPtr &obj1,const CheckedPtr &obj2){ return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr<obj2.curr; } bool operator>(const CheckedPtr &obj1,const CheckedPtr &obj2){ return obj1.beg==obj2.beg&&obj1.end==obj2.end&&obj1.curr>obj2.curr; } bool operator<=(const CheckedPtr &obj1,const CheckedPtr &obj2){ return !(obj1>obj2); } bool operator>=(const CheckedPtr &obj1,const CheckedPtr &obj2){ return !(obj1<obj2); } /*习题14.26*/ CheckedPtr operator+(const CheckedPtr &obj,const size_t n){ CheckedPtr tmp(obj); if(obj.curr+n>=obj.end) throw out_of_range("too large n"); tmp.curr+=n; return tmp; } CheckedPtr operator-(const CheckedPtr &obj,const size_t n){ CheckedPtr tmp(obj); if(obj.curr-n<obj.beg) throw out_of_range("too large n"); return tmp; }
时间: 2024-09-28 18:37:50