boost::singleton
Posted kloseer
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost::singleton相关的知识,希望对你有一定的参考价值。
singleton即单件模式,实现这种模式的类在程序生命周期里只能有且仅有一个实例。
使用singleton,需要包括头文件:
#include <boost/serialization/singletion.hpp>
using boost::serialization::singleton;
类摘要:
template <typename T>
class singleton : public boost:noncopyable
{
public:
static const T & get_const_instance();
static T&get_mutable_instance();
};
singleton把模板参数T时限为一个单件类,对类型T要求是有缺省的构造函数,而且在构造和析构时不能抛出异常,因为单件在mian() 前后构造和析构,如果发生异常时无法捕获的。
singleton提供两个静态成员函数访问单件实例,可分别获得常对象和可变对象。常对象单件总是线程安全,因为他不会改变内部状态,可变对象单件则不是线程安全的,可能发生线程竞争问题。
用法:
实现一个唯一的三维原点实例:
为了演示singleton的创建和销毁,增加了构造函数与析构函数:
class point
{
public:
point(int a=0,int b=0,int c=0) :x(a),y(b),z(c)
{
cout<<"point ctor"<<endl;
}
~point()
{
cout<<"point dtor"<<endl;
}
};
只需要把想成为单件的类作为它的模板参数就可以,接下来由singleton自动完成:
#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;
int main()
{
cout<<"main() start"<<endl;
typedef singleton<point> origin;
origin::get_const_instance().print();
origin::get_mutable_instance().print();
cout<<"main() fiinish"<<endl;
}
//运行结果:
point ctor
main() start
0,0,0
0,0,0
main() finish
point dtor
除了模板方式,还可以通过继承的方式来使用:
#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;
class point:public singleton<point>
{...}
int main()
{
cout<<"main() start"<<endl;
typedef singleton<point> origin;
origin::get_const_instance().print();
origin::get_mutable_instance().print();
cout<<"main() fiinish"<<endl;
}
继承的方式更为彻底一些。
以上是关于boost::singleton的主要内容,如果未能解决你的问题,请参考以下文章