C++ Primer 练习 12.19
来源:互联网 发布:六轴机械手臂编程 编辑:程序博客网 时间:2024/06/12 00:51
现在 是 第十二章的部分练习:
12.19:
定义你自己版本的StrBlobPtr,更新StrBlob类,加入恰当的friend声明及begin和end成员了。
这题 为了方便 我直接写在一个头文件里。
//StrBlob.h#include <iostream>#include <memory>#include<stdexcept>#include <string>#include <vector>using std::cout;using std::endl;using std::cin;class StrBlobPtr;class StrBlob {//友元声明friend class StrBlobPtr;public:typedef std::vector<std::string>::size_type size_type;StrBlob();StrBlob(std::initializer_list<std::string> il);size_type size() const { return data->size(); }bool empty() const { return data->empty(); }void push_back(const std::string &t) {data->push_back(t);}void pop_back();std::string & front();std::string& back();const std::string & front() const;const std::string & back() const;// begin() 和 end()StrBlobPtr begin();StrBlobPtr end();private:std::shared_ptr<std::vector<std::string>> data;void check(size_type i, const std::string &msg)const;};class StrBlobPtr {public:StrBlobPtr() : curr(0) {}StrBlobPtr(StrBlob &a, std::size_t sz = 0): wptr(a.data), curr(sz) {}std::string & deref() const;StrBlobPtr& incr();private:std::shared_ptr<std::vector<std::string>>check(std::size_t, const std::string &) const;std::weak_ptr<std::vector<std::string>> wptr;std::size_t curr;};//strblob 函数外部定义const std::string & StrBlob::front() const{check(0, "out range");return this->data->front();}const std::string &StrBlob::back() const{check(0, "out range");return data->back();}StrBlob::StrBlob() :data(std::make_shared<std::vector<std::string>>()) {}StrBlob::StrBlob(std::initializer_list < std::string> il) :data(std::make_shared<std::vector<std::string>>(il)) {};void StrBlob::check(size_type i, const std::string &msg)const{if (i >= data->size())throw std::out_of_range(msg);}std::string &StrBlob::front(){check(0, "front on empty StrBlob");return data->front();}std::string &StrBlob::back(){check(0, "back on empty StrBlob");return data->back();}void StrBlob::pop_back(){check(0, "pop_back on empty StrBlob");data->pop_back();}StrBlobPtr StrBlob::begin(){return StrBlobPtr(*this);}StrBlobPtr StrBlob::end(){auto ret = StrBlobPtr(*this, data->size());return ret;}//strblobptr 函数外部定义std::shared_ptr<std::vector<std::string>>StrBlobPtr::check(std::size_t i, const std::string &msg) const{auto ret = wptr.lock();if (!ret)throw std::runtime_error("unbound StrBlobPtr");if (i >= (*ret).size())throw std::out_of_range(msg);return ret;}std::string & StrBlobPtr::deref() const{auto p = check(curr,"dereference past end");return (*p)[curr];}StrBlobPtr & StrBlobPtr::incr(){check(curr, "increment past end of StrBlobPtr");++curr;return *this;}//主函数#include "StrBlob.h"
int main(){StrBlob b({ "233","2333","23333" });StrBlobPtr bp(b);bp.incr();cout << bp.deref() << endl;return 0;}12.20:
编写程序,逐行读入一个输入文件,将内容存入一个StrBlob中,用一个StrBlobPtr打印处StrBlob中的每个元素。
#include "StrBlob.h"int main(){ifstream in_file("text.txt");StrBlob b;string t;StrBlobPtr bp(b);while (getline(in_file,t))b.push_back(t);for (size_t i = 0; i != b.size(); i++){cout << bp.deref() << endl;bp.incr();}in_file.close();return 0;}
12.21:也可以这样编写StrBLobPtr的deref成员:
std::string & deref() const
{ return (*check(curr,"dereference pase end"))[curr];}
你认为那个版本更好?为什么?
原版本是:
std::string & deref()const{ auto p = check(curr,"dereference past end"); return (*p)[curr];}很明显,当然是 第一个版本好,显而易见,第一个版本 可读性比较好,第二个版本 咋一看 还不知道 不什么,要理清优先级,然后check返回一个shared_ptr指针再解引用,之后是下标运算获取元素,而第一版则 轻易看出 check 函数返回一个 指针 ,然后返回 解引用的元素。
12.22:
为了能让StrBlobPtr使用const StrBlob,你觉得应该如何修改?定义一个名为ConstStrBlobPtr的类,使其能够指向const StrBlob。
第一个问题 以我的方法就是 直接添加一个 接受 初始值是 const strblob 的构造函数,所以是:
StrBlobPtr(const StrBlob & a, std::size_t sz = 0) :wptr(a.data), curr(sz) {}直接再 StrBlobPtr 类里 加上这个成员函数。第二个问题 则是直接定义一个 构造函数 是上面的 构造函数的ConstStrBlobPtr类,是不是错了 ( ̄▽ ̄)" 不知道 不过挺好的。 望指出。
class ConstStrBlobPtr {public:ConstStrBlobPtr():curr(0) {}ConstStrBlobPtr(const StrBlob & a,size_t i = 0) : w(a.data),curr(i) {}string & deref() const;ConstStrBlobPtr & incr();private:shared_ptr<vector<string>> check(size_t, const string &) const;weak_ptr<vector<string>> w; //指向一个vector<string>的shared_ptr指针的对象size_t curr;};string & ConstStrBlobPtr::deref() const{auto p = check(curr,"wocao");return (*p)[curr];}ConstStrBlobPtr & ConstStrBlobPtr::incr(){check(curr, "wocaohhh");++curr;return *this;}shared_ptr<vector<string>> ConstStrBlobPtr::check(size_t i, const string & msg) const{auto pw = w.lock();if (!pw)throw std::runtime_error("hhhhh");if (i >= pw->size())throw std::out_of_range("xxxxx");return pw;}上面 就这样 ,也需要 关联 StrBlob类 作为 友元类,这点应该难不倒你们哈,你们自己搞哈 ,我 就。。。。溜了溜了。
以上,如果错了 ,望大家提出。(+_+)?
阅读全文
0 0
- C++Primer 练习 12.7
- c++primer练习10.9
- c++primer练习10.11
- c++primer练习10.13
- c++primer练习10.14
- c++primer练习10.15
- c++primer练习10.18
- c++primer 练习11.9
- c++primer练习11.33
- c++Primer 练习2.41
- C++Primer中文版中的练习
- C++primer 文本查询练习
- C++Primer练习3.13疑问?
- c primer 8.1练习答案
- C++Primer 练习9.44 解答
- c primer plus13章练习
- 【C++】primer plus 练习7.1
- 【C++】primer plus 练习7.2
- Matlab code for Gauss-Seidel and Successive over relaxation iterative methods
- OpenGL蓝宝书源码学习(二十)第六章——Dissolve
- unlink之64位下有保护措施的利用
- csdn如何转载别人的博客
- 模仿百度API接口搜索框
- C++ Primer 练习 12.19
- Android Loader的机制以及源码分析
- ubuntu 16.04 安装ROS时的依赖问题的解决
- 题解——Leetcode 16. 3Sum Closest 难度:Medium
- 让TextView的drawableLeft与文本一起居中
- Picasso使用Target无法回调的分析与解决
- 软件工程第五章知识点总结
- Linux下使用Apache访问FTP文件夹引起的问题
- linux:进程中信号的“3种状态 And 3张表”