[笔记]C++代码演示SingletonMap 单类Map实例
与上一篇《[笔记]C++代码演示Singleton单类实例》不同,本篇演示的是利用 STL 里的 map 和 list 容器,根据索引 key 的不同,返回不同的单实例类,调用举例如下:
MySingletonMap* MySM1 = SingletonMap<MySingletonMap>::GetInstance(1);
UML类图如下:
由上图易知,SingletonMap 是模板类,MySingletonMap 继承自 SingletonMap,具体代码如下:
#include <iostream> #include <map> #include <list>using namespace std;// 使用 map 存放单类实例的基类 template <class T, typename K = int> class SingletonMap{ public:// 先从 map 中根据 key 查找实例,如果没有就创建实例static T* GetInstance(K key){// 根据 key 查找实例typename map<K, T*>::iterator iter = GetMap().find(key);// 如果找到,就返回if (iter != GetMap().end()){return iter->second;}// 否则创建新的实例// 此处会进到构造函数 SingletonMap(K key) 里面,将实例插入 map 和 list 中return new T(key);}// 返回实例列表static list<T*>& GetAllInstances(){static list<T*> List;return List;}// 删除全部实例static void DeleteAllInstances() {list<T*>& List = GetAllInstances();list<T*>::iterator v;// 遍历 list 内的实例for(v = List.begin(); v != List.end();){cout << "Delete Instance " << ((T*)(*v))->getKey() << endl;delete *v; // 删除该项对应的实例v = List.erase(v); // 从 list 中删除该项 }}// 获得 keyK getKey() const {return m_Key;}protected:SingletonMap(K key): m_Key(key){pair<const K, T*> Elem(key, (T*)this); // 创建 pairGetMap().insert(Elem); // 将 pair 插入 mapGetAllInstances().push_back((T*)this); // 将自身插入 list }private:static map<K, T*>& GetMap(){static map<K, T*> Map; // 此处生成静态 mapreturn Map;}K m_Key; // key };// 继承自 SingletonMap 的子类 class MySingletonMap: public SingletonMap<MySingletonMap>{ private:friend class SingletonMap<MySingletonMap>; // 将 SingletonMap 设为 friend class MySingletonMap(int key): SingletonMap<MySingletonMap>(key){}virtual ~MySingletonMap(){} };int main(int argc, char* argv[]) {MySingletonMap* MySM1 = SingletonMap<MySingletonMap>::GetInstance(1); // 创建新实例cout << "Number of instances = " << MySingletonMap::GetAllInstances().size() << endl; // 返回1 MySingletonMap* MySM2 = SingletonMap<MySingletonMap>::GetInstance(2); // 创建新实例cout << "Number of instances = " << MySingletonMap::GetAllInstances().size() << endl; // 返回2 MySingletonMap* MySM3 = SingletonMap<MySingletonMap>::GetInstance(2); // 得到实例 MySM2cout << "Number of instances = " << MySingletonMap::GetAllInstances().size() << endl; // 返回2if (MySM2 == MySM3) {cout << "MySM2 == MySM3" << endl; // 因为二者相等,所以打印 MySM2 == MySM3} else {cout << "MySM2 != MySM3" << endl;}MySingletonMap::DeleteAllInstances(); // 删除全部实例 getchar();return 0; }
VC2010编译运行,结果为:
Number of instances = 1 Number of instances = 2 Number of instances = 2 MySM2 == MySM3 Delete Instance 1 Delete Instance 2
可见无需显式实例化,即可通过不同的索引得到不同的类单实例,这是用到了内含的 map。
如果需要遍历全部的实例,也可以利用内含的 list 进行迭代。
需要注意的是,上面代码并没有对由此获得的每个单实例的析构做处理,这一步就留给有兴趣者吧。
好吧,代码已经更新,提供了对全部实例的析构函数 DeleteAllInstances()。
转载于:https://www.cnblogs.com/journeyonmyway/archive/2012/06/28/2567215.html
[笔记]C++代码演示SingletonMap 单类Map实例相关推荐
- C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)
C++中 map的了解与基本用法(代码演示) 一:map的基本认识 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值) ...
- django_form表单类
表单功能在开发的过程当中有一半的需求是获取数据,另一半校验数据.针对于表单,校验分为前端校验和后端校验: 前端校验就是通过js或者jq脚本对form表单输入的数据进行校验,形象,直观,有利于对用户进行 ...
- Java笔记017-类变量和类方法、理解main方法语法、代码块、单例设计模式、final关键字
目录 面向对象编程(高级部分) 类变量和类方法 类变量-提出问题 传统方法解决 问题分析: 类变量快速入门 类变量内存布局 什么是类变量 如何定义类变量定义语法: 如何访问类变量 定义语法: 类变量使 ...
- 高斯核函数python代码_单类SVM:SVDD
话接上文(SVM的简单推导),这篇文章我们来看单类SVM:SVDD.可能大家会觉得很奇怪,我们为什么需要单分类呢?有篇博客举了一个很有意思的例子. 花果山上的老猴子,一生阅猴无数,但是从来没有见过其它 ...
- PipedInputStream类 和 PipedOutputStream类 的简单介绍和代码演示
PipedOutputStream类 和PipedInputStream 类为管道输出流 和管道输入流.通常都是以管道输出流作为管道的起始端,通常管道输出流和管道输入流通过connect方法连接起来, ...
- RandomAccessFile类的简单介绍,以及代码演示
RandomAccessFile类,支持对文件的读取和写入.并且可以设置写入和读取的位置.该位置主要是以字节体现.相当于该文件存储在一个大型byte[] 数组.隐含存在一个指向该数组的指针.类似于该类 ...
- 基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)
一.骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB:使用最广,包含信息最多,从RGB可以得到Flow.Skeleton.但是处理需要较大的计算量 Flow:光流 ...
- spring 常用注解 原理 逻辑 代码演示
01 spring 常用注解 原理 逻辑 代码演示 这是自己观看视频的笔记 文章目录 01 spring 常用注解 原理 逻辑 代码演示 一.组件注册 1.1-spring注解驱动开发 1.2-组件注 ...
- mmdetection多类目标训练查看单类准确率(AP)以及使用模型测试看结果(show)
本文主要是个人笔记,以后便于查询,也供借鉴.通常我们在mmdetection平台上就训练一类目标,训练过程中每跑完一个epoch就可以查看到该目标的0.5,0.75等阈值下的准确率,还有一个整体的mA ...
- Py函数直接传入root是啥意思_阿里云python课程笔记(四):函数amp;类和对象
接阿里云python课程笔记(三):数据结构 我们讨论一下python中的深拷贝和浅拷贝 dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}# 引用对象dic ...
最新文章
- 《信息系统项目管理师软考辅导——3年真题详解与全真模拟》主要创新点、关注点...
- gulp前端自动化相关文章收集
- myeclipse html选取包含元素的标签_HTML基础2019-1-21
- 哥的博客不是山寨,是公益
- Python 内建函数 max/min的高级用法
- python-greenlet模块(协程)
- scala学习-11-package object
- JavaScript 原始数据类型转换
- vue中使用富文本编辑器wangEditor及踩坑
- 深入Jetty源码之HttpGenerator
- 餐饮后厨计算机应用,美萍餐饮管理系统,餐饮管理软件,餐饮软件,酒店收银系统,饭店点菜系统 --- 管理软件 美萍是专家!...
- linux读usb转ttl串口数据,ubuntu16.04使用USB转TTL(ch340)串口转usb调试过程
- 金融+大数据解决方案:银行业
- PS怎么压缩图片大小而像素不变
- 冲刺计划sprint
- css的sprites什么意思,CSS Sprites是什么
- 蓝牙运动耳机什么牌子好,分享六款好用的运动耳机
- mysql主从复制-介绍
- python复数的实部和虚部都是整数嘛_Python数字(Number)
- 自制导航App(包含地图、定位、自定义marker、路线制定、模拟导航等功能)