以下是C ++ Primer第5版的练习:
练习12.20:编写一个程序,将一行读取一行输入到StrBlob中,并使用StrBlobPtr打印该StrBlob中的每个元素。
class StrBlob
{
friend class StrBlobPtr;
public:
StrBlob(): data(make_shared<vector<string>>()) { }
StrBlob(initializer_list<string> il):
data(make_shared<vector<string>>(il)) { }
int size() const { return data->size(); }
bool empty() const { return data->empty(); }
void push_back(const string& t) { data->push_back(t); }
void pop_back();
string& front();
string& back();
StrBlobPtr begin();
StrBlobPtr end();
private:
shared_ptr<vector<string>> data;
void check(int i, const string& msg) const;
};
class StrBlobPtr
{
public:
StrBlobPtr(): curr(0){ }
StrBlobPtr(StrBlob &a, size_t sz = 0):
wptr(a.data), curr(sz) { }
string& deref() const;
StrBlobPtr& incr();
private:
shared_ptr<vector<string>> check(size_t i, const string& msg) const;
weak_ptr<vector<string>> wptr;
size_t curr;
};
StrBlobPtr StrBlob::begin()
{
return StrBlobPtr(*this);
}
StrBlobPtr StrBlob::end()
{
return StrBlobPtr(*this, data->size());
}
我不明白智能指针wptr
如何通过调用默认构造函数绑定到data
中的StrBlobPtr StrBlob::begin
成员。
在StrBlobPtr StrBlob::end()
中,StrBlobPtr(StrBlob &a, size_t sz = 0):wptr(a.data), curr(sz) { }
被明确调用,wptr
被绑定到a.data
。
答案 0 :(得分:0)
正如@tetechhelp回答
StrBlob :: begin不调用默认构造函数(即带有0个参数的ctor),它使用默认参数调用重载的构造函数(在这种情况下,sz默认为0);所以在begin函数中返回StrBlobPtr(* this);与调用返回StrBlobPtr(* this,0);
相同