#include <iostream>
using namespace std;
class Screen{
};
class CheckedPtr{
public:
// 没有默认构造函数
CheckedPtr(Screen* b,Screen* e):beg(b),end(e),curr(b){}
//解引用操作符 *
Screen& operator*();
const Screen& operator*() const;
//下标操作符
Screen& operator[](const size_t);
const Screen& operator[](const size_t) const;
//前缀自增/自减操作符 返回引用 ++/--
CheckedPtr& operator++();
CheckedPtr& operator--();
//后缀自增/自减 返回值,而不是 返回引用 ++/--
CheckedPtr operator++(int);
CheckedPtr operator--(int);
//重载箭头操作符必须返回指向类类型的指针,或者返回定义了自己箭头操作符的类类型对象(递归调用箭头操作符,直到返回指针) ->
Screen* operator->();
const Screen* operator->()const;
private:
Screen *beg;
Screen *end;
Screen *curr;
};
Screen& CheckedPtr::operator*(){
if(curr==end)
exit(1);
else
return *curr;
}
const Screen& CheckedPtr::operator*()const{
if(curr==end)
exit(1);
else
return *curr;
}
Screen& CheckedPtr::operator[](const size_t index){
if(beg+index>=end||beg+index<=beg)
exit(1);
return *(beg+index);
}
const Screen& CheckedPtr::operator[](const size_t index)const{
if(beg+index>=end||beg+index<=beg)
exit(1);
return *(beg+index);
}
CheckedPtr& CheckedPtr::operator++(){
if(curr==end)
exit(1);
++curr;
return *this;
}
CheckedPtr& CheckedPtr::operator--(){
if(curr==end)
exit(1);
--curr;
return *this;
}
CheckedPtr CheckedPtr::operator++(int){
CheckedPtr ret(*this);
++*this;
return ret;
}
CheckedPtr CheckedPtr::operator--(int){
CheckedPtr ret(*this);
--*this;
return ret;
}
Screen* CheckedPtr::operator->(){
return curr;
}
const Screen* CheckedPtr::operator->()const{
return curr;
}
这里尤其要注意的是重载箭头操作符,举个例子:point->action(),编译器处理工作如下:
- 如果point是个指针,则编译器对指针解引用,并从结果对象获取指定成员,如果该对象没有定义该成员,则编译器产生一个错误
- 如果,point不是一个指针,则编译器先调用->箭头操作符,先从point->()返回结果
- 如果返回类型是指针,则解引用调用成员
- 否则,递归调用->操作符,如果编译器检查到其没有成员箭头,则递归错误