Boost开发指南-4.6singleton

news2024/11/18 9:21:36

singleton

singleton即单件模式,实现这种模式的类在程序生命周期里只能有且仅有一个实例。单件模式是一个很有用的创建型模式,有许多实际的应用,并被广泛且深入地研究。

虽然单件模式非常重要,但很遗憾目前Boost中并没有专门的单件库,而仅是在serialization库中有一个并不十分完善的实现,它位于名字空间boost::serialization。

为了使用singleton,需要包含头文件<boost/serialization/singleton.hpp>,即:

#include <boost/serialization/singleton.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的要求是有缺省构造函数,而且在构造和析构时不能抛出异常,因为单件在main()前后构造和析构,如果发生异常则会无法捕获。

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的用法非常简单,只需要把想成为单件的类作为它的模板参数就可以了,接下来的工作由 singleton自动完成。可能唯一的一点不方便之处是过长的类型名,但可以用t ypedef来简化:

#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;
int main()
{
	cout << "main() start" << endl;

	typedef singleton<point> origin; //单件类定义

	point::get_const_instance().print(); //常对象
	point::get_mutable_instance().print(); //可变对象

	cout << "main() finish" << endl;
}

代码中需要注意的是类名 singleton,还有就是访问实例的函数不是常用的instance(),而是get_const_instance()和 get_mutable_instance()。

除了这种模板方式,singleton还可以通过继承的方式来使用,把singleton作为单件类的基类,并把单件类作为singleton的模板参数:

#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;

class point : public singleton<point> //注意这里
{...}

int main()
{
	cout << "main() start" << endl;

	point::get_const_instance().print(); //常对象
	point::get_mutable_instance().print(); //可变对象

	cout << "main() finish" << endl;
}

这段代码与模板参数的用法仅有很小的不同,最重要的变化在于point类的基类声明处public继承singleton<point>(如果读者不熟悉泛型编程,则可能会对这种父类中使用子类的形式有些困惑),因此point继承了singleton的所有能力,包括不可拷贝和单件。

与模板参数方式相比,继承方式实现单件模式更为彻底一些(很像noncopyable的用法),使被单件化的类成为了一个真正的单件类,而模板参数方式则更“温和”一些,它包装(wrap)了被单件化的类,对原始类没有任何影响。

代码示例

#include <iostream>
using namespace std;

#include <boost/serialization/singleton.hpp>
using boost::serialization::singleton;

//
class point : public singleton<point>
{
	int x, y, z;
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;
	}

	void print()const
	{
		cout << x << "," << y << "," << z << endl;
	}

};

typedef singleton<point> origin;

//

int main()
{
	cout << "main() start" << endl;

	origin::get_const_instance().print();
	origin::get_mutable_instance().print();

	point::get_const_instance().print();
	point::get_mutable_instance().print();

	cout << "main() finish" << endl;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/886746.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IDA调试安卓应用

先安装好IDA工具 找到需要放到android上的android_server文件 我这里是64位的 # 将android_server64放入到手机/data/local/tmp adb push d:\as /data/local/tmp/as启动android_server 默认的端口是23946, 但我指定了一个新的端口 PC端端口转发 adb forward tcp:23946 tcp:…

django实现文件上传

在django中实现文件上传有三种方法可以实现&#xff1a; 自己手动写使用Form组件使用ModelForm组件 其中使用ModelForm组件实现是最简单的。 1、自己手写 先写一个上传的页面 upload_file.html enctype"multipart/form-data 一定要加这个&#xff0c;不然只会上传文件名…

在Orangepi5开发板3588s使用opencv获取摄像头画面

先感谢香橙派群的管理员耐心指导&#xff0c;经过不断的调试修改最后成功通过opencv调用mipi摄像头获取画面 就记录分享一下大概步骤希望大家少踩点坑&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 我用的固件系统是ubuntu2022.0.4 固件是&#x…

【java毕业设计】基于SSM+MySql的个人交友网站设计与实现(程序源码)--个人交友网站

基于SSMMySql的个人交友网站设计与实现&#xff08;程序源码毕业论文&#xff09; 大家好&#xff0c;今天给大家介绍基于SSMMySql的个人交友网站设计与实现&#xff0c;本论文只截取部分文章重点&#xff0c;文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业设计源…

Git 目录详解

一、Git目录详解 在使用Git时&#xff0c;有几个目录和文件在Git项目中扮演着重要的角色&#xff0c;下面详细介绍一下这些目录和文件的作用 1、.git目录 .git目录是Git项目的核心&#xff0c;包含了Git的版本库和元数据等重要信息。在该目录中&#xff0c;有一些重要的子目录和…

Python Web框架:Django、Flask和FastAPI巅峰对决

今天&#xff0c;我们将深入探讨Python Web框架的三巨头&#xff1a;Django、Flask和FastAPI。无论你是Python小白还是老司机&#xff0c;本文都会为你解惑&#xff0c;带你领略这三者的魅力。废话不多说&#xff0c;让我们开始这场终极对比&#xff01; Django&#xff1a;百…

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云

【腾讯云 TDSQL-C Serverless产品体验】抓取processon热门模版的标题生成词云 serverless服务是腾讯云自研的新一代云原生关系型数据库TDSQ L-C的无服务器架构版&#xff0c;是全Serverless架构的云原生数据库 前言 体验了一下腾讯云刚出的TDSQL-C Serverless&#xff0c;使用…

阿里云故障洞察提效 50%,全栈可观测建设有哪些技术要点?

本文根据作者在「TakinTalks 稳定性社区 」公开分享整理而成 #一分钟精华速览# 全栈可观测是一种更全面、更综合和更深入的观测能力&#xff0c;能协助全面了解和监测系统的各个层面和组件&#xff0c;它不仅仅是一个技术上的概念&#xff0c;更多地是技术与业务的结合。在“…

Oracle外部表ORACLE_LOADER方式加载数据

当数据源为文本或其它csv文件时&#xff0c;oracle可通过使用外部表加载数据方式&#xff0c;不需要导入可直接查询文件内的数据。 1、如下有一个文件名为&#xff1a;test1.txt 的数据文件。数据文件内容为&#xff1a; 2、使用sys授权hr用户可读写 DATA_PUMP_DIR 目录权限&a…

Python tkinter Notebook标签添加关闭按钮元素,及左侧添加存储状态提示图标案例,类似Notepad++页面

效果图展示 粉色框是当前页面&#xff0c;橙色框是鼠标经过&#xff0c;红色框是按下按钮&#xff0c;灰色按钮是其他页面的效果&#xff1b; 存储标识可以用来识别页面是否存储&#xff1a;例如当前页面已经保存用蓝色&#xff0c;未保存用红色&#xff0c;其他页面已经保存用…

数据分析 | 调用Optuna库实现基于TPE的贝叶斯优化 | 以随机森林回归为例

1. Optuna库的优势 对比bayes_opt和hyperoptOptuna不仅可以衔接到PyTorch等深度学习框架上&#xff0c;还可以与sklearn-optimize结合使用&#xff0c;这也是我最喜欢的地方&#xff0c;Optuna因此特性可以被使用于各种各样的优化场景。 2. 导入必要的库及加载数据 用的是sklea…

idea插件开发-自定义语言01Language和LanguageType

Intellij platform本质是对不同的开发语言提供支持&#xff0c;举例来说我们也可以用notebook.app来开发java代码&#xff0c;但效率上可能没有可比性。因为Intellij idea提供了很多语言特定功能&#xff08;例如语法高亮显示和代码分析&#xff09;。很多插件本质上都是效率插…

AI项目二:基于mediapipe的虚拟鼠标控制

若该文为原创文章&#xff0c;转载请注明原文出处。 一、项目介绍 由于博主太懒&#xff0c;mediapipe如何实现鼠标控制的原理直接忽略&#xff0c;最初的想法是想控制摄像头识别手指控制鼠标&#xff0c;达到播放电影的效果。基本上效果也是可以的。简单的说是使用mediapipe检…

【软件测试】随笔系统测试报告

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: 软件测试 随笔系统采用 SSM 框架前后端分离的方法实现&#xff0c;本文主要针对功能&#xff1a;登录&#xff0c;注册&#xff0c;注销&#xff0c;写随笔&#xff0c;删除随笔&#xff0c;随笔详情页…

SQLite数据库实现数据增删改查

当前文章介绍的设计的主要功能是利用 SQLite 数据库实现宠物投喂器上传数据的存储&#xff0c;并且支持数据的增删改查操作。其中&#xff0c;宠物投喂器上传的数据包括投喂间隔时间、水温、剩余重量等参数。 实现功能&#xff1a; 创建 SQLite 数据库表&#xff0c;用于存储宠…

【KD】2023 ICML Linkless Link Prediction via Relational Distillation

1、简介 图神经网络(GNN)有很强的链接预测能力,但是其计算依赖于对邻居节点知识的聚合,因此导致其在实际应用中往往有较高的延迟。与GNN不同,多层感知机(MLP)在预测时不依赖于邻居节点信息,因此其推理速度更快,但也在一定程度上影响了其预测准确性。为了同时利用这两…

Linux下如何修改CPU 电源工作模式

最近处理一起历史遗留问题&#xff0c;感觉很爽。 现象&#xff1a; 背景&#xff1a;设备采用ARM&#xff0c;即rk3568处理器&#xff0c;采用Linux系统&#xff1b;主要用于视觉后端处理 现象&#xff1a;当软件运行一段时间&#xff0c;大概1个小时&#xff08;也不是很固定…

安卓开发问题记录:app:checkDebugDuplicateClasses

开发过程中报错&#xff1a; Duplicate class android.support.v4.app.INotificationSideChannel found in modules core-1.7.0-runtime (androidx.core:core:1.7.0) and support-v4-21.0.3-runtime (com.android.support:support-v4:21.0.3)按网上找到的说法&#xff1a;新引…

Java学习路线大全推荐来啦!

Java作为目前最热门使用最广泛的编程语言之一&#xff0c;许多人都想学习它。但Java学习书籍那么多&#xff0c;如何选择适合自己的呢?在这里&#xff0c;小编将为大家推荐两本Java学习书籍。 1.动力节点Java 《Java从零基础到精通》是一本Java实用教材&#xff0c;由动力节点…

Maven(四)常用命令大全

目录 一、mvn 命令参数二、mvn 插件命令1.介绍2.查看插件的使用文档3.常用的插件命令 官网地址&#xff1a; https://maven.apache.org/官方插件清单&#xff1a; https://maven.apache.org/plugins/index.html Maven 是一个强大的构建工具&#xff0c;它提供了许多命令来进行项…