您的位置:首页 > 其它

文件中类的存放

2015-12-10 16:18 288 查看
当在一个文件中定义多个相互关联的类时除了要前置声明外,一定要放好类的声明位置和实现位置

否者会出现一下错误

forward declaration of 'class StrBlobPtr'|

return type 'class StrBlobPtr' is incomplete|

invalid use of incomplete type 'class StrBlobPtr'|

//正确实例class A与class B相互关联

class B;/前置/声明

class A{//声明

};

class B{//s声明

};

、、、//A实现

、、、//B实现

c++primer中shared_ptr和weak_ptr的应用

模拟vector<string>

#include<iostream>
#include<memory>
#include<vector>
class StrBlobPtr;
class StrBlob
{
friend class StrBlobPtr;
public:
using size_type=std::vector<std::string>::size_type;
StrBlob();
StrBlob(std::initializer_list<std::string>il);
size_type size()const
{
return data->size();
}

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

std::string& front();
const std::string& front()const;
std::string& back();
const std::string& back()const;
StrBlobPtr begin();
StrBlobPtr end();
private:
std::shared_ptr<std::vector<std::string>>data;

void check(size_type i,const std::string &msg)const;
};
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();
}
const std::string& StrBlob::front()const
{
check(0,"front on empty StrBlob");
return data->front();
}
std::string& StrBlob::back()
{
check(0,"back on empty StrBlob");
return data->back();
}
const std::string& StrBlob::back()const
{
check(0,"back on empty StrBlob");
return data->back();
}
void StrBlob::pop_back()
{
check(0,"pop_back on empty StrBlob");
data->pop_back();
}
//////////////////////////////////////////////////
class StrBlobPtr
{
public:
StrBlobPtr():curr(0){}
StrBlobPtr(StrBlob &a,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;
};
//////////////////////////
StrBlobPtr StrBlob::begin()
{
return StrBlobPtr(*this);
}
StrBlobPtr StrBlob::end()
{
auto ret=StrBlobPtr(*this,data->size());
return ret;
}
/////////////////////////////
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;
}
int main()
{
StrBlob b={"111","222","333"};
std::vector<std::string>svec={"444","555","666"};
for(const auto s:svec)
b.push_back(s);

/* text1 //111 222 333 444 555 666 抛出异常
for(auto iter=b.begin();;iter.incr())
std::cout<<iter.deref()<<" ";
std::cout<<std::endl;

text 2
b.pop_back();
//111 222 333 444 555 抛出异常
for(auto iter=b.begin();;iter.incr())
std::cout<<iter.deref()<<" ";
std::cout<<std::endl;

text 3
//111 666
std::cout<<b.front()<<" "<<b.back()<<std::endl;
*/
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: