第14章14.3.1節練習&14.3.2節練習
練習14.16
StrBlobクラス(12.1.1セクション、405ページ参照)、StrBlobPtrクラス(12.1.6セクション、421ページ参照)、StrVecクラス(13.5セクション、465ページ参照)、Stringクラス(13.5セクション、470ページ参照)の等しい演算子と等しくない演算子をそれぞれ定義します.
回答:
StrBlobクラス(12.1.1セクション、405ページ参照)、StrBlobPtrクラス(12.1.6セクション、421ページ参照)、StrVecクラス(13.5セクション、465ページ参照)、Stringクラス(13.5セクション、470ページ参照)の等しい演算子と等しくない演算子をそれぞれ定義します.
回答:
class StrBlob {
friend class StrBlobPtr;
public:
typedef std::vector<:string>::size_type size_type;
// constructors
StrBlob() : data(std::make_shared<:vector>>()) { }
//...
size_type size() const { return data->size(); }
bool empty() const { return data->empty(); }
// ...
private:
std::shared_ptr<:vector>> data;
// throws msg if data[i] isn't valid
void check(size_type i, const std::string &msg) const;
};
以上がStrBlobの定義部分bool operator==(const StrBlob& lstr, const StrBlob& rstr){
return *(lstr.data) == *(rstr.data);
}
bool operator!=(const StrBlob& lstr, const StrBlob& rstr){
return *(lstr.data) != *(rstr.data);
}
ここではvectorが持参した関係演算子を直接使用して比較します.class StrBlobPtr {
friend bool eq(const StrBlobPtr&, const StrBlobPtr&);
public:
StrBlobPtr(): curr(0) { }
StrBlobPtr(StrBlob &a, size_t sz = 0): wptr(a.data), curr(sz) { }
std::string& deref() const;
StrBlobPtr& incr(); // prefix version
StrBlobPtr& decr(); // prefix version
private:
// check returns a shared_ptr to the vector if the check succeeds
std::shared_ptr<:vector>>
check(std::size_t, const std::string&) const;
// store a weak_ptr, which means the underlying vector might be destroyed
std::weak_ptr<:vector>> wptr;
std::size_t curr; // current position within the array
};
以上は、StrBlobPtrの定義部分である.関係が等しいオペレータを定義するには、ここではweak_ptrですが、いずれもポインタで、使い方も普通のポインタとあまり違いません.bool operator==(const StrBlobPtr& lstrp, const StrBlobPtr& rstrp){
return *(lstrp.wptr) == *(rstrp.wptr) && (lstrp.curr == rstrp.curr);
}
bool operator!=(const StrBlobPtr& lstrp, const StrBlobPtr& rstrp){
return *(lstrp.wptr) != *(rstrp.wptr) || (lstrp.curr != rstrp.curr)
}
class StrVec {
public:
// copy control members
StrVec():
elements(nullptr), first_free(nullptr), cap(nullptr) { }
//...
std::string *elements; // pointer to the first element in the array
std::string *first_free; // pointer to the first free element in the array
std::string *cap; // pointer to one past the end of the array
};
以上がStrVecの定義部分bool operator==(const StrVec& lstr, const StrVec& rstr){
return (*(lstr.elements) == *(rstr.elements)) && (*(lstr.first_free) == *(rstr.first_free)) && (*(lstr.cap) == *(rstr.cap));
}
bool operator!=(const StrVec& lstr, const StrVec& rstr){
return (*(lstr.elements) != *(rstr.elements)) || (*(lstr.first_free) != *(rstr.first_free)) || (*(lstr.cap) != *(rstr.cap));
}
class String {
//...
String() : sz(0), p(nullptr) { }
//...
std::size_t sz;
char *p;
//...
};
String
bool operator==(const String& lstr, const String& rstr){
return (lstr.sz == rstr.sz) && !(strcmp(lstr.p, rstr.p));
}
bool operator!=(const String& lstr, const String& rstr){
return (lstr.sz != rstr.sz) || !(strcmp(lstr.p, rstr.p));
}
14.17
14.18
StrBlobクラス、StrBlobPtrクラス、StrVecクラス、Stringクラスの を します.
:bool operator *(rstr.data);
}
bool operator>(const StrBlob& lstr, const StrBlob& rstr){
return !(lstr > rstr);
}
bool operator
bool operator
bool operator
14.19