在这种情况下,智能指针weak_ptr如何绑定到shared_ptr?

时间:2015-04-25 15:57:40

标签: c++

以下是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

1 个答案:

答案 0 :(得分:0)

正如@tetechhelp回答

  

StrBlob :: begin不调用默认构造函数(即带有0个参数的ctor),它使用默认参数调用重载的构造函数(在这种情况下,sz默认为0);所以在begin函数中返回StrBlobPtr(* this);与调用返回StrBlobPtr(* this,0);

相同