在这种情况下,智能指针弱\u ptr如何绑定到共享\u ptr? 下面是C++入门第五版的练习:

在这种情况下,智能指针弱\u ptr如何绑定到共享\u ptr? 下面是C++入门第五版的练习:,c++,C++,练习12.20:编写一个程序,将输入文件一次读取一行到StrBlob中,并使用StrBlobPtr打印该StrBlob中的每个元素 我不明白智能指针wptr是如何绑定到strbloptr StrBlob::中StrBlob的数据成员的,首先调用默认构造函数 在StrBlobPtr StrBlob::end、StrBlobPtrStrBlob&a、size_t sz=0:wptra.data中,显式调用currsz{},并将wptr绑定到a.data。As@tetechhelp StrBlob::

练习12.20:编写一个程序,将输入文件一次读取一行到StrBlob中,并使用StrBlobPtr打印该StrBlob中的每个元素

我不明白智能指针wptr是如何绑定到strbloptr StrBlob::中StrBlob的数据成员的,首先调用默认构造函数


在StrBlobPtr StrBlob::end、StrBlobPtrStrBlob&a、size_t sz=0:wptra.data中,显式调用currsz{},并将wptr绑定到a.data。

As@tetechhelp

StrBlob::begin不调用默认构造函数,即使用0个参数的构造函数,它使用默认参数sz调用重载构造函数,在这种情况下,sz默认为0;因此在begin函数中返回StrBlobPtr*this;与调用return StrBlobPtr*this相同,0


我不知道你在问什么。StrBlob::begin调用StrBlobPtrStrBlob&a,size_t sz=0构造函数,该构造函数也会初始化wptr。看起来弱ptr是这样的,当StrBlob被删除时,它存储的向量也会被删除,即使有StrBlobPtr对象指向它。正如@hynner所述,StrBlob::begin不调用默认构造函数,即使用0个参数的构造函数,它使用默认参数sz调用重载构造函数,在这种情况下,sz默认为0;因此在begin函数中返回StrBlobPtr*this;与调用return StrBlobPtr*this,0;相同。。您是否对成员初始化列表的工作方式感到困惑,以至于wptra.data,currsz将数据绑定到重载构造函数中的弱ptr?@txtechhelp是的,我忘记了默认参数的函数。我理解这个问题。谢谢。@hynner我误解了默认构造函数的调用。非常感谢。
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());
}