单例模板模式控制台管理机制

本文详细介绍了C++中单例模式的实现方式,并通过控制台应用示例展示了如何使用单例模式。主要内容包括单例模式的基本概念、C++模板类的运用、控制台事件处理函数封装以及主函数的调用接口。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Control.h
#pragma once

#ifndef __CONTROL__H
#define __CONTROL__H

#include<Windows.h>
template<typename T>
class CControl
{
protected:
	CControl();
	~CControl();
	CControl(const CControl &control);
	CControl & operator = (const CControl &control);
public :
	static CControl *GetInstance();
	static void DestoryInstance();

	//封装控制台事件处理函数
	static BOOL WINAPI HandlerRoutine(DWORD dwCtrltype);//SetConsoleCtrlHandler
	//提供给main调用接口
	BOOL OpenControl();
	void CloseControl();
	//提供派生类去实现资源初始化和资源销毁的方法
	//因为不知道子类具体有什么
	BOOL Init()
	{
		return TRUE;
	}
	void UnInit()
	{
	}
public :
	//控制台事件通知主线程退出标记
	static BOOL m_bQuit;
private:
	static CControl *m_pSingleton;
};


////////////////////////////////////单例///////////////////////////////////////////
template<typename T>
CControl<T>* CControl<T>::m_pSingleton = NULL;
template<typename T>
CControl<T>::CControl()
{

}
template<typename T>
CControl<T>::~CControl()
{
}
template<typename T>
CControl<T>::CControl(const CControl<T> &control)
{
}
template<typename T>
CControl<T> & CControl<T>::operator = (const CControl<T> &control)
{
	return *CControl<T>::m_pSingleton;
}
template<typename T>
CControl<T> *CControl<T>::GetInstance()
{
	if(CControl<T>::m_pSingleton == NULL)
	{
		CControl<T>::m_pSingleton = new T;
	}
	return CControl<T>::m_pSingleton;
}

template<typename T>
void CControl<T>::DestoryInstance()
{
	if(CControl<T>::m_pSingleton != NULL)
	{
		delete (T*)CControl<T>::m_pSingleton;//**********注意删除子类的对象**************
		CControl<T>::m_pSingleton = NULL;
	}
}
///////////////////////////////////////////////////////////////////////////
template<typename T>
BOOL CControl<T>::m_bQuit = FALSE;
//封装控制台事件处理函数
template<typename T>
 BOOL WINAPI CControl<T>::HandlerRoutine(DWORD dwCtrltype)
 {
	 switch(dwCtrltype)
	 {
	 case CTRL_CLOSE_EVENT:
	 case CTRL_LOGOFF_EVENT:
	 case CTRL_SHUTDOWN_EVENT:
		 {
			 CControl<T>::m_bQuit = TRUE;
			 while(1)
			 {
				 ::Sleep(10);
			 }
		 }
		 break;
	 }
	 return TRUE;
 }
//提供给main调用接口
 template<typename T>
BOOL CControl<T>::OpenControl()
{
	//设置控制台事件
	::SetConsoleCtrlHandler(CControl<T>::HandlerRoutine,TRUE);
	//初始化派生类
	((T*)CControl<T>::m_pSingleton)->Init();
	return TRUE;                               
}
template<typename T>
void CControl<T>::CloseControl()
{
	//反初始化派生类
	((T*)CControl<T>::m_pSingleton)->UnInit();
}
#endif


main.cpp
#include "Kernel.h"
#include <iostream>

using namespace std;

int main()
{
	//获取单利
	CControl<CKernel>* pControl = CControl<CKernel>::GetInstance();

	//初始化单利
	pControl->OpenControl();

	//等待销毁
	while (pControl->m_bQuit == FALSE)
	{
		::Sleep(10);
	}
	pControl->CloseControl();
	CControl<CKernel>::DestroyInstance();
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值