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

发布于:2024-10-09 ⋅ 阅读:(139) ⋅ 点赞:(0)

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;
}




网站公告

今日签到

点亮在社区的每一天
去签到