第14章14.3.1節練習&14.3.2節練習

4039 ワード

練習14.16
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