在这种情况下,智能指针弱\u ptr如何绑定到共享\u ptr? 下面是C++入门第五版的练习:
练习12.20:编写一个程序,将输入文件一次读取一行到StrBlob中,并使用StrBlobPtr打印该StrBlob中的每个元素 我不明白智能指针wptr是如何绑定到strbloptr StrBlob::中StrBlob的数据成员的,首先调用默认构造函数在这种情况下,智能指针弱\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::
在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());
}