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的更多相关文章
- 转:Singleton模式
C++完美实现Singleton模式 转自:http://www.cppblog.com/dyj057/archive/2005/09/20/346.html boost库的Singleton的实现 ...
- [转] boost库的Singleton的实现以及static成员的初始化问题
http://www.cnblogs.com/kex1n/archive/2011/04/05/2006194.html effectie c++的条款4中提到: (global对象,定义在names ...
- 转:C++ Boost/tr1 Regex(正则表达式)快速指南
C++ Boost/tr1 Regex(正则表达式)快速指南 正则表达式自Boost 1.18推出,目前已经成为C++11(tr1)的标准部分. 本文以Boost 1.39正则表达式为基础,应该广泛适 ...
- item2,实现singleton模式
单例模式? 只能实现一个实例的类成为单例. ============== muduo库中单例模式实现 #include<boost/noncopyable.hpp> //#include ...
- boost muti-thread
背景 • 今天互联网应用服务程序普遍使用多线程来提高与多客户链接时的效率:为了达到最大的吞吐量,事务服务器在单独的线程上运行服务程序: GUI应用程序将那些费时,复杂的处理以线程的形式单独 ...
- 可以继承的C++ Singleton基类
单例模式(Singleton Pattern)是设计模式中的一种,它用来保证系统中最多只能存在一个它的实例,其做法是由类自身来创建和持有它的对象实例,把对实例的创建权和管理权都控制在自己手中,以便控制 ...
- (七)boost库之单例类
(七)boost库之单例类 一.boost.serialzation的单件实现 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一 ...
- Boost程序库完全开发指南——深入C++“准”标准库(第3版)
内容简介 · · · · · · Boost 是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库,有着“C++‘准’标准库”的美誉. Boost 由C++标准委员会部分成员所设立的Bo ...
- Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET
Boost::Thread使用示例 - CG-Animation - 博客频道 - CSDN.NET Boost::Thread使用示例 分类: C/C++ 2011-07-06 14:48 5926 ...
随机推荐
- ajax后台跳转无效的原因
Ajax只是利用脚本访问对应url获取数据而已,不能做除了获取返回数据以外的其它动作了.所以浏览器端是不会发起重定向的. 1)正常的http url请求,只有浏览器和服务器两个参与者.浏览器端发起一个 ...
- 剑指offer59:按之字形顺序打印二叉树:[[1], [3,2], [4,5,6,7]]
1 题目描述 请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推. 2 思路和方法 先给定一个二叉树的样式: ...
- pycharm 使用black
pycharm 使用black The Uncompromising Code Formatter By using Black, you agree to cede control over min ...
- FFmpeg开发教程一、FFmpeg 版 Hello world
本系列根据项目ffmpeg-libav-tutorial翻译而来 Chapter 0 - 万物之源 -- hello world 然而,本节的程序并不会在终端打印"Hello world&q ...
- dfs的剪枝优化
两个剪枝问题 1. 当两点的距离(需要走的步数)大于剩下的时间时 剪去 2.奇偶剪枝问题 如果起点到终点所需走的步数的奇偶性与时间奇偶性不同的时候 剪去 起点到终点步数的奇偶性的判断 首先 明确点的奇 ...
- LeetCode每日一练(1-3)
题目导航 1. 两数之和 2. 两数相加 3. 无重复字符的最长子串 1. 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的 ...
- Java Web-Redis学习
Java Web-Redis学习 基本概念 Redis是一款高性能的NOSQL系列的.非关系型数据库 NOSQL:not only SQL,是一系列非关系型数据库的总称,例如radis.hbase等数 ...
- php批量检测并去除BOM头的代码
开发中会遇到BOM头, 导致程序无法执行. 浏览器返回接口如下图: 去除BOM头解决方法:<?phpini_set('memory_limit','1024M'); function check ...
- kvm第二章--虚拟机管理
- 自定义过滤器和标签 & 静态文件相关
自定义过滤器和标签 1.在settings中的INSTALLED_APPS配置当前app,不然django无法找到自定义的simple_tag. 2.在app中创建templatetags模块(模块名 ...