当我们需要在stl的库中装入多态类的对象时,通常的做法是在容器里装入父类的指针,然后手动释放,如我有以下两个类
class Light
{
....
}
class PointLight:public Light
{
...
}
std::vector<Light*> lights;
lights.push_back(new PointLight());
上面的做法有如下几点弊端:
1.容易忘记释放掉指针,造成内存泄漏;
2不是异常安全的
boost中的Pointer Container库为我们提供了一种安全的方法来实现容器中的多态,并且其官方文档中也列举了一些优点如异常安全、速度快(相对于smart pointer而言)等,有兴趣的读者可以自己去看,这里讲下它的使用方法。
基本使用
boost::ptr_vector<Light> lights;
lights.push_back(new PointLight());
如上所示,当lights这个对象柝构里会自动释放掉其包含的指针指向的对象。
间接接口
lights[0].getColor();
从上可以看出,我们取出的元素可以像对象而不是指针一样使用
关联容器
对于stl中的几乎所有窗口pointer container库几乎都提供了相应的类,当然也包括关联窗口。
当我们想使用boost::ptr_set这个类时,必须要求这个类的<操作符有定义,如
inline bool operator<(const Light& l1,const Light& l2)
{
return l1.getColor().getRed() < l2.getColor().getRed();
}
boost::ptr_set<Light> lights;
lights.insert(new PointLight());
lights.insert(new PointLight());
对于boost::multimap这个类要注意,当向里插入的时候键值必须是一个左值(由于要确保异常安全),否则编译会不通过,如
boost::ptr_multimap<std::string,Light> lights;string a = "a",b="b";
lights.insert(a,new PointLight());
lights.insert(b,new PointLight());
如下代码会报错
lights.insert("aa",new PointLight());
空指针
默认情况下,如果你插入一个空指针会抛出异常的,如果你想允许插入空指针,则必须提前声明,如
boost::ptr_vector<boost::nullable<Light>> lights;
lights.push_back(NULL);
一旦你允许空指针,则使用前必须检查,如
typedef boost::ptr_vector<boost::nullable<Light>> Light_type;
for(Light_type
::iterator i = lights.begin();
i != lights.end(); ++i )
{
if( !boost::is_null(i) ) // always check for validity
i->getColor();
}
或者如何容器支持随机存取的话也可以用如下的方法
for( Light_type::size_type i = 0u;
i != lights.size(); ++i )
{
if( !lights.is_null(i) )
lights[i].getColor();
}
注意对于ptr_set和ptr_multiset来说这显然空指针显然没意义。
分享到:
相关推荐
Boost 模板元编程学习笔记(二),开始你模板元编程的历程。C++,模板,标准库,元编程,教程,笔记
在boost中有自带的日志库供开发人员使用但效率不是最高的: 加入头文件#include 即可引入日志库 boost中的log库有以下六种级别: BOOST_LOG_TRIVIAL(trace) << A trace severity message; BOOST_LOG_TRIVIAL...
Boost库学习指南 Boost库学习指南 Boost库学习指南 Boost库学习指南
Boost库学习指南 Boost库学习指南Boost库学习指南 Boost库学习指南
Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。大部分boost库功能的使用只需包括相应头文件即可,少数(如正则表达式库,文件系统库等)需要链接库。里面有许多具有工业强度的库,如graph库。STL集中在...
boot库
使用boost.python 编写扩展python库,使用mfc例子调用扩展的python库。 myPydll 工程为扩展python库,生成文件myPydll.dll,将该文件拷贝到python解释器可搜索的路径下,如我的电脑就是“C:\Python26\DLLs”,并改...
BOOST学习资料整理收集
Boost是C++标准库开发人员参与编写的,非常好。里面有各种数组、线程池、通信库等,是Linux、Window通用的东西。不学他,就落伍了。
开发库boost1.59版本64位全库,包含代码及编译好的库,debug,release都有,需要的下载之后加载即可使用,支持跨平台操作
boost学习资料 boost graph 库 boost中文说明
Boost社区建立的初衷之一就是为C++的标准化工作提供可供参考的实现,Boost社区的发起人Dawes本人就是C++标准委员会的成员之一。在Boost库的开发中,Boost社区也在这个方向上取得了丰硕的成果。在送审的C++标准库TR1...
在CentOS7虚拟机环境下编译的boost 1.69版本的静态库和动态库,经过测试,编译的库能够正常使用
boost boost库 boost boost库boost boost库 boost boost库boost boost库boost boost库
《Boost深入剖析之使用技巧》第四讲:Boost容器库(中).flv 如果你还在为自己写的程序存在各种野指针,内存泄漏,甚至崩溃的问题而苦恼的话,请使用boost;如果你还在为自己写的程序存在很多与Windows依赖的操作导致...
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。在C++社区中影响...
Beyond+the+C+++Standard+Library(boost中文版) Boost程序库完全开发指南:深入C++_准_标准库 第3版 中文 Boost程序库探秘
Boost库是一个经过千锤百炼、可移植、提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一。 Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容。 Boost中比较有...