C++ Primer : 第十二章 : 动态内存之shared_ptr类实例:StrBlob类

StrBlob是一个管理string的类,借助标准库容器vector,以及动态内存管理类shared_ptr,我们将vector保存在动态内存里,这样就能在多个对象之间共享内存。

定义StrBlob类:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  // for out_of_range


class StrBlob
{
public:
	typedef std::vector::size_type size_type;
	typedef std::shared_ptr> shdptrStrVec;

	StrBlob();
	StrBlob(std::initializer_list il);
	StrBlob(std::vector::iterator& left, std::vector::iterator& right);
	StrBlob(std::vector& vec);

	size_type size() const { return data->size(); }
	bool empty() const { return data->empty();}

	void push_back(const std::string& str ){ data->push_back(str);}
	void pop_back();

	// 访问元素
	std::string& front();
	std::string& back();
	// const 版本
	const std::string& front() const;
	const std::string& back() const;

	std::string& at(size_type i){ return data->at(i); }
	
	StrBlob& operator = (StrBlob& blob);

private:

	std::shared_ptr> data;

	void check(size_type i, const std::string& msg) const;
};



StrBlob的实现:

StrBlob::StrBlob() : data(std::make_shared>())
{
}


StrBlob::StrBlob(std::initializer_list il) : data(std::make_shared> (il))
{
}

StrBlob::StrBlob(std::vector::iterator& left, std::vector::iterator& right) : data(std::make_shared>(left, right)){


}

StrBlob::StrBlob(std::vector& vec) : data(std::make_shared>(vec)) {
}

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, "");
	return data->front();
}

std::string& StrBlob::back()
{
	check(0, "");
	return data->back();
}

const std::string& StrBlob::front() const
{
	check(0, "");
	return data->front();
}

const std::string& StrBlob::back() const
{
	check(0, "");
	return data->back();
}

void StrBlob::pop_back()
{
	check(0, "");
	data->pop_back();
}

StrBlob& StrBlob::operator =(StrBlob& blob) {

	this->data = blob.data;

	return *this;
}



你可能感兴趣的:(C++)