栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++单例模式

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++单例模式

单例:一个类只能创建一个对象

实现步骤:

1.将构造函数声明为类的私有成员 private;

2.通过静态成员函数申请对象空间 ,并返回地址;

3.定义一个静态变量标记,记录对象的个数,该静态成员变量是开关变量,通过控制这个静态标记达到控制只创建一个对象的目的;

4.在析构函数中,将静态变量标记置成1,达到重复利用该静态变量标记目的;

源代码:

#include 

using namespace std;

// 单例模式,一个类只能创建一个对象
class Cbase
{
	// 1.声明一个私有的类构造函数
private:
	Cbase()
	{
		cout << "我是类的私有构造函数n";
	}

public:
	// 2. 声明一个静态变量标记,用于控制类对象的创建
	static char flag;	// 类的静态成员函数必须在类外进行初始化
	
	// 3.声明一个共有的静态类指针成员函数,返回类的地址空间,
	// 目的:创建类对象可以通过类名作用域调用这个静态指针函数
	static Cbase* function()
	{
		// 通过判断标记变量flag 进行函数的返回操作
		if (1 == flag)
		{
			// 将标记置成0,达到开关变量目的
			cout << "成功创建对象n";
			flag = 0;
			// 返回类的地址空间
			return new Cbase;
		}
		else
		{
			// 直接返回空
			cout << "已经有一个对象了,不能在进行创建新的对象了,请释放当前对象,已达到再一次创建对象目的n";
			return NULL;
		}	
	}
	// 4.在析构函数中将静态变量标记flag置成1,达到重复利用目的
public:
	~Cbase()
	{
		flag = 1;
	}

};
// 初始化类的静态成员变量
char Cbase::flag = 1;	// 注意初始化的时候需要用类名作用域


int main(int argn, char* argv[])
{
	// 创建类的对象 (指针)
	const Cbase* pt = Cbase::function();	// 注意要用类名作用域调用类的静态指针成员函数
	
	// 尝试不释放类指针对象,进行创建对象
	const Cbase* pt2 = Cbase::function();

	system("pause");
	return 0;
}

程序运行结果1:

源代码2:

int main(int argn, char* argv[])
{
	// 创建类的对象 (指针)
	const Cbase* pt = Cbase::function();	// 注意要用类名作用域调用类的静态指针成员函数
	delete pt; // 释放

	// 尝试不释放类指针对象,进行创建对象
	const Cbase* pt2 = Cbase::function();
	delete pt2;

	system("pause");
	return 0;
}

程序运行结果2:

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/784256.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号