首页 > 代码库 > shared_ptr与weak_ptr的例子
shared_ptr与weak_ptr的例子
12.20 编写程序,逐行读入一个输入文件,将内容存入一个StrBlob中,用一个StrBlobPtr打印出StrBlob的每个元素。
StrBlob.h
#ifndef STRBLOB_H#define STRBLOB_H#include<iostream>#include<string>#include<vector>#include<memory>using namespace std;class StrBlobPtr;class StrBlob{friend class StrBlobPtr;public: typedef string::size_type size_type; //构造函数 StrBlob(); explicit StrBlob(initializer_list<string> il); size_type 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(); string& front() const; string& back() const; size_type count() { return data.use_count(); } StrBlobPtr begin(); StrBlobPtr end();private: shared_ptr<vector<string>> data; void check(size_type i,const string msg) const;};#endif // STRBLOB_H
StrBlob.cpp
#include"StrBlob.h"#include"StrBlobPtr.h"StrBlob::StrBlob():data(make_shared<vector<string>>()){}StrBlob::StrBlob(initializer_list<string> il):data(make_shared<vector<string>>(il)){}void StrBlob::pop_back(){ check(0,"pop_back"); data->pop_back();}string& StrBlob::back(){ check(0,"back"); return data->back();}string& StrBlob::front(){ check(0,"front"); return data->front();}string& StrBlob::back() const{ check(0,"back"); return data->back();}string& StrBlob::front() const{ check(0,"front"); return data->front();}void StrBlob::check(size_type i, const string msg) const{ if(i>=data->size()) throw out_of_range(msg);}StrBlobPtr StrBlob::begin(){ return StrBlobPtr(*this);}StrBlobPtr StrBlob::end(){ return StrBlobPtr(*this,data->size());}
StrBlobPtr.h
#ifndef STRBLOBPTR_H#define STRBLOBPTR_H#include<string>#include<vector>#include<memory>using namespace std;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,const string &) const; weak_ptr<vector<string>> wptr; size_t curr;};#endif
StrBlobPtr.cpp
#include"StrBlob.h"#include"StrBlobPtr.h"shared_ptr<vector<string>> StrBlobPtr::check(size_t i, const string& msg) const{ shared_ptr<vector<string>> ret=wptr.lock(); if(!ret) throw runtime_error("unbound StrBlobPtr"); if(i>=ret->size()) throw out_of_range(msg); return ret;}string& StrBlobPtr::deref() const{ auto ret=check(curr,"deference"); return (*ret)[curr];}StrBlobPtr& StrBlobPtr::incr(){ check(curr,"increment"); ++curr; return *this;}
useStrBlob.cpp
#include"StrBlob.h"#include"StrBlobPtr.h"#include<fstream>int main(){ ifstream in("1.txt"); StrBlob Str; StrBlobPtr StrP(Str); string tmp; while(getline(in,tmp)) { Str.push_back(tmp); } size_t l=Str.size(); while(l) { cout<<StrP.deref()<<endl; StrP.incr(); --l; } return 0;}
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。