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