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的更多相关文章

  1. 转:Singleton模式

    C++完美实现Singleton模式  转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...

  2. [转] boost库的Singleton的实现以及static成员的初始化问题

    http://www.cnblogs.com/kex1n/archive/2011/04/05/2006194.html effectie c++的条款4中提到: (global对象,定义在names ...

  3. 转:C++ Boost/tr1 Regex(正则表达式)快速指南

    C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...

  4. item2,实现singleton模式

    单例模式? 只能实现一个实例的类成为单例. ============== muduo库中单例模式实现 #include<boost/noncopyable.hpp> //#include ...

  5. boost muti-thread

    背景 •       今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时,复杂的处理以线程的形式单独 ...

  6. 可以继承的C++ Singleton基类

    单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制 ...

  7. (七)boost库之单例类

    (七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...

  8. Boost程序库完全开发指南——深入C++“准”标准库(第3版)

    内容简介  · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...

  9. Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET

    Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET Boost::Thread使用示例 分类: C/C++ 2011-07-06 14:48 5926 ...

随机推荐

  1. Mybatis笔记3

    Mybatis映射文件的SQL深入 (Mybatis今天学的不多,看了半天的mysql必知必会) 动态sql语句-if语句,查询一个用户的时候,有可能根据地址查询,用户名查询,性别查询等,所以需要动态 ...

  2. Python21之内嵌函数和闭包

    一.内嵌函数 内嵌函数指的是在一个函数体内部定义的函数,可以称它为函数的函数,也就是子函数,外部的函数称之为母函数,就类似局部变量和全局变量 子函数体内定义的变量只在其函数内部有效,但其内部可以调用母 ...

  3. centos 6.10 oracle 19c安装

    centos 7以下版本安装oracle 19c 问题较多,centos 以上版本没有任何问题.记录如下. hosts文件,否则图形界面无法启动 127.0.0.1 localhost localho ...

  4. Spring Boot使用@Value注解获取配置文件中的属性

    获取配置文件的内容——

  5. (转)FFMPEG类库打开流媒体的方法(需要传参数的时候)

    本文链接:https://blog.csdn.net/leixiaohua1020/article/details/14215393 使用ffmpeg类库进行开发的时候,打开流媒体(或本地文件)的函数 ...

  6. UOJ #7 NOI2014购票(点分治+cdq分治+斜率优化+动态规划)

    重写一遍很久以前写过的题. 考虑链上的问题.容易想到设f[i]为i到1的最少购票费用,转移有f[i]=min{f[j]+(dep[i]-dep[j])*p[i]+q[i]} (dep[i]-dep[j ...

  7. MyBatis整合Spring+SpringMVC搭建一个web项目(SSM框架)

    本文讲解如何搭建一个SSM架构的web站点 [工具] IDEA.SqlYog.Maven [简述] 该项目由3个模块组成:dao(数据访问层).service(业务处理层).web(表现层) dao层 ...

  8. MySQL绿色版mysql-5.7.17-winx64简洁安装教程

    1.解压MySQL绿色版,复制my-default.ini,修改名称为my.ini 2. 以下为my.ini文件 # For advice on how to change settings plea ...

  9. Lambda 表达式动态拼接.

    背景: 项目使用EF 查询时需要手动判断条件写.觉得太麻烦就Google 如何动态生成Linq.最后找到了 System.Linq.Dynamic.Core. 这个东西. Scott Guthrie ...

  10. 线程三(Mutex)

    C# 中 Mutex 类也是用于线程同步操作的类,例如,当多个线程同时访问一个资源时保证一次只能有一个线程访问资源. 在 Mutex 类中,WaitOne() 方法用于等待资源被释放, Release ...