练习12.19:定义你自己版本的StrBlobPtr,更新StrBlob类,加入恰当的 friend声明及begin和end成员。 练习12.20:编写程序,逐行读入一个输入文件,将内容存入一个 St

题目:

练习12.19:定义你自己版本的StrBlobPtr,更新StrBlob类,加入恰当的
friend声明及begin和end成员。
练习12.20:编写程序,逐行读入一个输入文件,将内容存入一个
StrBlob中,用一个StrBlobPtr打印出StrBlob中的每个元素。

难点

1.最开始分成两个头文件去写,导致重复声明了

2.StrBlob的默认构造函数没有对data进行构造,导致其没有容量,一添加就出错。

4. 一个头文件声明两个类,需要先声明后定义,而相关函数,需要在类定义以后再进行定义。

3. 需要重载运算符,不然StrBlobPtr无法进行比较。

#ifndef STRBLOB_H_
#define STRBLOB_H_

#include<iostream>
#include<vector>
#include<string>
#include<memory>

using namespace std;

class StrBlobPtr;
class StrBlob
{
public:
	using size_type = vector<string>::size_type;

	StrBlob() :data(make_shared < vector<string>>()){};
	StrBlob(initializer_list<string>il):
		data(make_shared<vector<string>>(il)){}
	size_type getSize() const
	{
		return data->size();
	}
	bool empty()const {
		return data->empty();
	}
	void push_back(const string& str);
	void pop_back() ;
	const string& front()const;
	const string& back()const;

	StrBlobPtr begin();
	StrBlobPtr end();

private:
	shared_ptr<vector<string>>data; //现在是指针了
	bool check(size_type size, const string& str)const;
	friend class StrBlobPtr;
};


class StrBlobPtr
{
public:
	StrBlobPtr() :curr(0) {}
	StrBlobPtr(StrBlob& a, size_t sz = 0) :wptr(a.data), curr(sz) {}
	bool operator!=(const StrBlobPtr& p) { return p.curr != curr; }
	string& deref()const;
	StrBlobPtr& incr();

private:
	weak_ptr<vector<string>>wptr;
	size_t curr;
	shared_ptr<vector<string>> check(size_t sz, const string& msg) const;
	
};
inline shared_ptr<vector<string>>
StrBlobPtr::check(size_t sz, const string& str)const
{
	auto ret = wptr.lock();
	if (!ret)
	{
		throw runtime_error("unbound StrBlobPtr");
	}
	if (sz >= ret->size())
	{
		throw out_of_range(str);
	}
	return ret;
}

//返回vector中的最后一个元素
inline string&
StrBlobPtr::deref()const
{
	auto p = check(curr, "out_of_range");
	return (*p)[curr];
}
//前缀递增
inline StrBlobPtr&
StrBlobPtr::incr()
{
	auto p = check(curr, "increment past end of StrBlobPtr");
	++curr;
	return *this;
}



inline bool
StrBlob::check(size_type size, const string& msg)const
{
	if (!size)
	{
		throw out_of_range(msg);
		return false;
	}
	return true;
}

inline void
StrBlob::push_back(const string& str)
{
	return (*data).push_back(str);
}

inline void
StrBlob::pop_back()
{
	if (check(data->size(), "容器为空,弹出失败!"))
	{
		data->pop_back();
		cout << "弹出成功" << endl;
	}
}

inline const string&
StrBlob::front()const
{
	if (check(data->size(), "容器为空,查看头元素失败!"))
	{
		return data->front();
	}
}

inline const string&
StrBlob::back()const
{
	if (check(data->size(), "容器为空,查看为元素失败!"))
	{
		return data->back();
	}
}


inline StrBlobPtr
StrBlob::begin()
{
	return StrBlobPtr(*this);
}

inline StrBlobPtr
StrBlob::end()
{
	auto ret = StrBlobPtr(*this, data->size());
	return ret;
}

#endif STRBLOB_H_
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据提供的引用内容,出现"ssh: connect to host 10.32.12.19 port 22: Connection refused"错误可能是由于以下原因导致的: 1. 网络连接问题:请确保你的网络连接正常,并且能够访问目标主机。你可以尝试使用ping命令来测试与目标主机的连接性。例如,在命令输入`ping 10.32.12.19`来检查与目标主机的连接。 2. SSH服务未启动:请确保目标主机上的SSH服务已经启动。你可以通过运`sudo service ssh start`来启动SSH服务。 3. 防火墙设置:防火墙可能会阻止SSH连接。请检查目标主机上的防火墙设置,并确保允许SSH连接通过。你可以尝试临时禁用防火墙来测试是否是防火墙导致的问题。 4. SSH配置错误:请检查你的SSH配置文件,确保正确配置了目标主机的IP地址和端口号。你可以在配置文件中找到这些信息并进相应的更改。 5. 目标主机不支持SSH连接:请确保目标主机支持SSH连接,并且已经正确配置了SSH服务。如果你无法确定目标主机是否支持SSH连接,请联系系统管理员或主机提供商以获取更多帮助。 以下是一些可能有用的命令和步骤: 1. 使用ping命令测试与目标主机的连接性: ```shell ping 10.32.12.19 ``` 2. 启动SSH服务: ```shell sudo service ssh start ``` 3. 检查防火墙设置: ```shell sudo ufw status ``` 4. 临时禁用防火墙: ```shell sudo ufw disable ``` 5. 编辑SSH配置文件(例如,/etc/ssh/sshd_config): ```shell sudo nano /etc/ssh/sshd_config ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值