当前位置: 首页 > news >正文

实例构造函数单例模式

本篇文章朋友在北京游玩的时候突然想到的...这段时间就有想写几篇关于实例构造函数的笔记,所以回家到之后就奋笔疾书的写出来发表了

    class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; };

    

该类有如下特色:

    

(1)它有一个指独一实例的静态指针m_pInstance,并且是私有的。

    

(2)它有一个私有的函数,可以获得这个独一的实例,并在须要的时候创建该实例。

    

(3)它的构造函数是私有的,这样就不能从别处创建该类的实例。

    


    下面我们对该类进行测试:

    #include <iostream> using namespace std; class CSingleton { public: static CSingleton * GetInstance(); int GetVar(); void SetVar(int other); private: CSingleton(); /* 默认的构造函数设置为私有 */ ~CSingleton(); static CSingleton *m_pInstance; int m_var; }; CSingleton::CSingleton() : m_var(20) { cout << "Singleton Constructor!" << endl; } CSingleton::~CSingleton() { cout << "Singleton Destructor!" << endl; } CSingleton* CSingleton::m_pInstance = NULL; /* 初始化为NULL */ CSingleton * CSingleton::GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } int CSingleton::GetVar() { return m_var; } void CSingleton::SetVar(int other) { m_var = other; } int main() { CSingleton *ton1 = CSingleton::GetInstance(); CSingleton *ton2 = CSingleton::GetInstance(); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton1->GetVar() << endl; ton1->SetVar(150); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton2->GetVar() << endl; return 0; }

    执行结果为:

    实例和构造函数

    我们知道,程序在结束的时候,系统会主动析构全部的全局变量。事实上,系统也会析构全部的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的独一任务就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):

    #include <iostream> usng namespace std; class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton(); } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; class CGarbo { public: CGarbo() { cout << "CGarbo Constructor!" << endl; } ~CGarbo() { if (CSingleton::m_pInstance != NULL) { delete m_pInstance; m_pInstance = NULL; cout << "CGarbo Destructor!" << endl; } } }; static CGarbo garbo; };

    每日一道理
灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部分人平平凡凡却实实在在。

    

使用这类方法释放单例对象的方式有如下特征:

    

(1) 在单例外部定义专有的嵌套类

    

(2) 在单例内定义私有的专门用于释放单例对象的静态成员

    

(3)利用程序在结束时析构全局变量的特性,选择最终的释放机会

    

(4)使用C++单例模式的代码不须要任何操纵,不必关心对象的释放

    


    

下面是测试样例:
#include <iostream>
using namespace std;

class CSingleton
{
public:
	static CSingleton * GetInstance();
	int GetVar();
	void SetVar(int other);
private:
	CSingleton();			/* 默认的构造函数设置为私有 */
	~CSingleton();
	static CSingleton *m_pInstance;
	int m_var;
	class CGarbo
	{
	public:
		CGarbo()
		{
			cout << "CGarbo Constructor!" << endl;
		}
		~CGarbo()
		{
			if (CSingleton::m_pInstance != NULL)
			{
				delete m_pInstance;
				m_pInstance = NULL;
				cout << "CGarbo Destructor!" << endl;
			}
		}
	};
	static CGarbo garbo;
};

CSingleton::CGarbo CSingleton::garbo;

CSingleton::CSingleton() : m_var(20)
{
	cout << "Singleton Constructor!" << endl;
}

CSingleton::~CSingleton()
{
	cout << "Singleton Destructor!" << endl;
}

CSingleton* CSingleton::m_pInstance = NULL;
CSingleton * CSingleton::GetInstance()
{
	if (m_pInstance == NULL)
	{
		m_pInstance = new CSingleton;
	}
	return m_pInstance;
}

int CSingleton::GetVar()
{
	return m_var;
}

void CSingleton::SetVar(int other)
{
	m_var = other;
}

int main()
{
	CSingleton *ton1 = CSingleton::GetInstance();
	CSingleton *ton2 = CSingleton::GetInstance();
	cout << "ton1 var = " << ton1->GetVar() << endl;
	cout << "ton2 var = " << ton1->GetVar() << endl;
	ton1->SetVar(150);
	cout << "ton1 var = " << ton1->GetVar() << endl;
	cout << "ton2 var = " << ton2->GetVar() << endl;

	return 0;
}

执行结果为:
实例和构造函数

文章结束给大家分享下程序员的一些笑话语录: Bphone之你们聊,我先走了!移动说:我在phone前加o,我叫o缝;苹果说:我在phone前i,我是i缝;微软说:我在phone前加w,我叫w缝;三星说:你们聊,我先走了!
将来王建宙写回忆录的时候,一定要有一句“常小兵为中国移动的发展做出了不可磨灭的贡献”。

--------------------------------- 原创文章 By 实例和构造函数 ---------------------------------

相关文章:

  • linux目录架构
  • 通过dhcpstatus监视DHCP服务ip地址分配情况
  • guest账户下关闭电源选项
  • 网页设计中如何控制文本框的宽度
  • c++编写函数验证哥德巴赫猜想
  • (转)VC++中ondraw在什么时候调用的
  • poj2575
  • 系统函数
  • Java基础代码实例 :在控制台中输出金字塔,这个金字塔是由左右对称的数字组成的。...
  • Linq中使用Left Join
  • jdbc封装
  • Eclipse不能重新编译 java文件
  • SAP HANA中导入文件时的时间格式问题
  • LoadRunner结果分析笔记
  • Fedora 16 安装 Mp3和视频播放器
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • Android开源项目规范总结
  • CSS魔法堂:Absolute Positioning就这个样
  • Javascript基础之Array数组API
  • JS字符串转数字方法总结
  • Laravel Mix运行时关于es2015报错解决方案
  • Map集合、散列表、红黑树介绍
  • npx命令介绍
  • React Native移动开发实战-3-实现页面间的数据传递
  • Redis 中的布隆过滤器
  • SpringBoot几种定时任务的实现方式
  • webpack4 一点通
  • windows下如何用phpstorm同步测试服务器
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 三分钟教你同步 Visual Studio Code 设置
  • 深度学习在携程攻略社区的应用
  • 使用agvtool更改app version/build
  • 学习Vue.js的五个小例子
  • 异步
  • 字符串匹配基础上
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • # 执行时间 统计mysql_一文说尽 MySQL 优化原理
  • #pragam once 和 #ifndef 预编译头
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (pojstep1.1.2)2654(直叙式模拟)
  • (多级缓存)多级缓存
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (一)UDP基本编程步骤
  • (原創) 未来三学期想要修的课 (日記)
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat文件调用java类的main方法
  • .net中应用SQL缓存(实例使用)
  • /*在DataTable中更新、删除数据*/
  • [C#]OpenCvSharp结合yolov8-face实现L2CS-Net眼睛注视方向估计或者人脸朝向估计
  • [C/C++]数据结构 堆的详解
  • [C语言]——函数递归