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

C++ 单例模式(模板继承+单例模式)

C++ 的单例模式

manager.h

#ifndef _MANAGER_H_  // #ifndef的意义:防止头文件被重复包含和编译
#define _MANAGER_H_  // #define 同上
// 代码内容

//类的权限默认是私有的
class Manager
{
public: // 类权限设置为 公有

	// 获取自身实例对象
	static Manager* instance() {
		// 若不存在则创建,若存在则直接返回
		if (!manager) {
			manager = new Manager();
		}
		return manager;
	}

	~Manager() = default;


private: //类权限设置为 内部访问
	// 创建
	static Manager* manager;

private: //类权限设置为 内部访问

	// 单例模式 只允许有一个
	Manager() = default;
};

#endif // 同上

main.cpp

#include <iostream>
#include "manager.h"


int main()
{   
    // 单例模式 获取实例化对象
    Manager* manager = Manager::instance();
    
    return 0;
}

模板继承+单例模式

manager.h是基础类,game_manager.h 继承于 manager.h

game_manager.h

#ifndef _GAME_MANAGER  // #ifndef的意义:防止头文件被重复包含和编译
#define _GAME_MANAGER  // #define 同上#pragma once

#include "manager.h"


//类的权限默认是私有的
class Game_Manager : public Manager<Game_Manager>
{
	// 友元函数:一般是在类内声明为友元(friend)的全局函数。声明后,该函数可以访问类的私有成员
	friend class Manager<Game_Manager>;

public: // 类权限设置为 公有
	
private: //类权限设置为 内部访问
	

protected: // protected成员可以被派生类对象访问,不能被用户代码(类外)访问。
	
	Game_Manager()
	{

	}

	~Game_Manager()
	{

	}
};

#endif // 同上


manager.h

#ifndef _MANAGER_H_  // #ifndef的意义:防止头文件被重复包含和编译
#define _MANAGER_H_  // #define 同上
// 使用模板
template <typename T>

//类的权限默认是私有的
class Manager
{
public: // 类权限设置为 公有

	// 获取自身实例对象
	static T* instance() {
		// 若不存在则创建,若存在则直接返回
		if (!manager) {
			manager = new T();
		}
		return manager;
	}

	


private: //类权限设置为 内部访问
	// 创建
	static T* manager;

protected: //成员可以被派生类对象访问,不能被用户代码(类外)访问。

	// 单例模式 只允许有一个
	Manager() = default;

	~Manager() = default;

	// 删除 拷贝构造函数
	Manager(const Manager&) = delete;
	// 删除 运算符
	Manager& operator = (const Manager&) = delete;


};

template <typename T>
T* Manager<T>::manager = nullptr;

#endif // 同上

main.cpp

#include <iostream>
#include "manager.h"
#include "Game_Manager.h"




int main()
{   
    // 
    Game_Manager* instane = Game_Manager::instance();
    std::cout << "Hello Demo" << std::endl;


    return 0;
}




http://www.kler.cn/news/334849.html

相关文章:

  • 运放选择时考虑的参数
  • 如何通过视频美颜SDK实现高效的直播美颜API开发?
  • tftp传文件被服务器拒绝进入tftp: server error: (768) Access to staonline.pcap denied
  • 【unity游戏开发】彻底理解AnimatorStateInfo,获取真实动画长度
  • 大模型/Sora/世界模型之间是什么关系,对自动驾驶的意义是什么?
  • 智慧学生宿舍管理平台|学生宿舍管理平台系统|基于Springboot+VUE的智慧学生宿舍管理平台系统设计与实现(源码+数据库+文档)
  • 鸿蒙 arkts json数据解析
  • 【AGC005D】~K Perm Counting(计数抽象成图)
  • MySQL 日志 - Binlog
  • 通信工程学习:什么是OSPF开放式最短路径优先
  • cnn突破二(bpnet三层网络增加bias后,识别率没有下降)
  • jdk版本与环境变量配置的版本不一致问题
  • pdf处理1
  • 课设实验-数据结构-单链表-文教文化用品品牌
  • 血液细胞计数与检测(BCCD)数据集教程
  • 03 去重排序
  • VSCode 中配置 C/C++ 环境的步骤
  • STL07——手写一个简单版本的unordered_set
  • Python编程探索:从基础语法到循环结构实践
  • 千万不要运行!几个可以整蛊你朋友的Python程序!