文件中类的存放
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>
否者会出现一下错误
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; }
相关文章推荐
- 如何在真机上调试Android应用程序(图文详解)
- Integer等等和equals的注意之处
- 使用IOS企业版证书发布应用
- PHP创建PowerPoint2007文档的方法
- ls -bash: ls: command not found 修改 /etc/profile 后命令不识别
- android加深笔记--IPC通信之Messenger
- project euler 71
- java获取request中参数
- mongodb-2
- 几种移动开发技术的比较和选型
- jsp分页
- 中枢理论3
- 另类的package-info.java文件探讨
- 安装pear
- 如何git push到非bare远程库
- HDU 5592 ZYB's Premutation(树状数组+二分)
- kindeditor在火狐浏览器下批量上传的session变化问题
- Spring注解@Component、@Repository、@Service、@Controller区别
- swift学习2 元组 tuples
- Spring4+SpringMVC4+Mybatis3框架整合