与上一篇《[笔记]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实例相关推荐

  1. C++中 Map的了解与基本用法(代码演示+自我总结+map中一对多的用法)

    C++中 map的了解与基本用法(代码演示) 一:map的基本认识 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值) ...

  2. django_form表单类

    表单功能在开发的过程当中有一半的需求是获取数据,另一半校验数据.针对于表单,校验分为前端校验和后端校验: 前端校验就是通过js或者jq脚本对form表单输入的数据进行校验,形象,直观,有利于对用户进行 ...

  3. Java笔记017-类变量和类方法、理解main方法语法、代码块、单例设计模式、final关键字

    目录 面向对象编程(高级部分) 类变量和类方法 类变量-提出问题 传统方法解决 问题分析: 类变量快速入门 类变量内存布局 什么是类变量 如何定义类变量定义语法: 如何访问类变量 定义语法: 类变量使 ...

  4. 高斯核函数python代码_单类SVM:SVDD

    话接上文(SVM的简单推导),这篇文章我们来看单类SVM:SVDD.可能大家会觉得很奇怪,我们为什么需要单分类呢?有篇博客举了一个很有意思的例子. 花果山上的老猴子,一生阅猴无数,但是从来没有见过其它 ...

  5. PipedInputStream类 和 PipedOutputStream类 的简单介绍和代码演示

    PipedOutputStream类 和PipedInputStream 类为管道输出流 和管道输入流.通常都是以管道输出流作为管道的起始端,通常管道输出流和管道输入流通过connect方法连接起来, ...

  6. RandomAccessFile类的简单介绍,以及代码演示

    RandomAccessFile类,支持对文件的读取和写入.并且可以设置写入和读取的位置.该位置主要是以字节体现.相当于该文件存储在一个大型byte[] 数组.隐含存在一个指向该数组的指针.类似于该类 ...

  7. 基于骨骼关键点的动作识别(OpenMMlab学习笔记,附PYSKL相关代码演示)

    一.骨骼动作识别 骨骼动作识别是视频理解领域的一项任务 1.1 视频数据的多种模态 RGB:使用最广,包含信息最多,从RGB可以得到Flow.Skeleton.但是处理需要较大的计算量 Flow:光流 ...

  8. spring 常用注解 原理 逻辑 代码演示

    01 spring 常用注解 原理 逻辑 代码演示 这是自己观看视频的笔记 文章目录 01 spring 常用注解 原理 逻辑 代码演示 一.组件注册 1.1-spring注解驱动开发 1.2-组件注 ...

  9. mmdetection多类目标训练查看单类准确率(AP)以及使用模型测试看结果(show)

    本文主要是个人笔记,以后便于查询,也供借鉴.通常我们在mmdetection平台上就训练一类目标,训练过程中每跑完一个epoch就可以查看到该目标的0.5,0.75等阈值下的准确率,还有一个整体的mA ...

  10. Py函数直接传入root是啥意思_阿里云python课程笔记(四):函数amp;类和对象

    接阿里云python课程笔记(三):数据结构 我们讨论一下python中的深拷贝和浅拷贝 dic1 = {'user': 'lsgogroup', 'num': [1, 2, 3]}# 引用对象dic ...

最新文章

  1. 《信息系统项目管理师软考辅导——3年真题详解与全真模拟》主要创新点、关注点...
  2. gulp前端自动化相关文章收集
  3. myeclipse html选取包含元素的标签_HTML基础2019-1-21
  4. 哥的博客不是山寨,是公益
  5. Python 内建函数 max/min的高级用法
  6. python-greenlet模块(协程)
  7. scala学习-11-package object
  8. JavaScript 原始数据类型转换
  9. vue中使用富文本编辑器wangEditor及踩坑
  10. 深入Jetty源码之HttpGenerator
  11. 餐饮后厨计算机应用,美萍餐饮管理系统,餐饮管理软件,餐饮软件,酒店收银系统,饭店点菜系统 --- 管理软件 美萍是专家!...
  12. linux读usb转ttl串口数据,ubuntu16.04使用USB转TTL(ch340)串口转usb调试过程
  13. 金融+大数据解决方案:银行业
  14. PS怎么压缩图片大小而像素不变
  15. 冲刺计划sprint
  16. css的sprites什么意思,CSS Sprites是什么
  17. 蓝牙运动耳机什么牌子好,分享六款好用的运动耳机
  18. mysql主从复制-介绍
  19. python复数的实部和虚部都是整数嘛_Python数字(Number)
  20. 自制导航App(包含地图、定位、自定义marker、路线制定、模拟导航等功能)

热门文章

  1. 前端那些事之日历多选插件篇
  2. [python] 字典和列表中的pop()函数
  3. 自制操作系统:引导扇区的实现
  4. Shiro(二)——Shiro认证入门案例
  5. java获取电脑配置_Java.Utils:获取电脑配置信息
  6. [2018.10.11 T2] 整除
  7. [2018.07.14 T1] B君的第四题
  8. Vue-Router学习笔记-(黑马视频)
  9. nginx负载均衡原理(理解篇)
  10. nginx基于域名的虚拟主机配置实战