练习14.30:
StrBlobPtr类的解引用运算符和箭头运算符:
class StrBlobPtr
{
friend bool operator==(const StrBlobPtr&, const StrBlobPtr&);
friend bool operator!=(const StrBlobPtr&, const StrBlobPtr&);
friend bool operator<(const StrBlobPtr&, const StrBlobPtr&);
friend bool operator<=(const StrBlobPtr&, const StrBlobPtr&);
friend bool operator>(const StrBlobPtr&, const StrBlobPtr&);
friend bool operator>=(const StrBlobPtr&, const StrBlobPtr&);
//指针算术
friend StrBlobPtr operator+(const StrBlobPtr& sb, size_t n);
friend StrBlobPtr operator-(const StrBlobPtr& sb, size_t n);
public:
StrBlobPtr() : curr(0) { }
StrBlobPtr(StrBlob& a, size_t sz = 0) :wptr(a.data), curr(sz) { }
std::string& deref() const;
StrBlobPtr& incr();
//递增递减运算符
//前置版本
StrBlobPtr& operator++();
StrBlobPtr& operator--();
//后置版本,为了使前置后置的重载版本无法区分,后置版本接受一个额外不被使用的int类型的形参
//当我们使用后置运算符时,编译器为这个形参提供一个值为0的实参
StrBlobPtr& operator++(int);
StrBlobPtr& operator--(int);
//解引用运算符
std::string& operator*()const
{
auto p = check(curr, "dereference past end");
return (*p)[curr];
}
//下标运算符
std::string* operator->()const
{
//将实际工作委托给解引用运算符
return & this->operator*();
}
private:
std::shared_ptr<std::vector<std::string>>check(std::size_t, const std::string&)const;
std::weak_ptr<std::vector<std::string>>wptr;
std::size_t curr;
};
ConstStrBlobPtr类与StrBlobPtr类基本相同,略
练习14.31:
StrBlobPtr的成员为weak_ptr智能指针以及size_t,智能指针有自己的拷贝,赋值,析构函数,size_t是内置类型,由系统管理,所以不需要额外自己管理,直接使用编译器定义的合成版本
练习14.32:
class StrBlobPtrDate {
public:
//重载箭头运算符
std::string* operator->()const
{
return ptr->operator->();
}
private:
StrBlobPtr* ptr;
//其他成员...
};