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

单例模式 c++实现

singleton.h:

#ifndef _SINGLETON_H_
#define _SINGLETON_H_

// Singleton 模式

#include "sync.h"
// #define NULL ((void *)0)

template <typename T>
class Singleton
{
private:
    Singleton() {};                              // ctor hidden
    Singleton (Singleton const&);                // copy ctor hidden
    Singleton & operator=( Singleton const&);    // assign op. hidden
    ~ Singleton ();                              // dtor hidden

    static T* instance_;

public:
    static T* Instance()
    {
        // double-check locking
        if (instance_ == NULL)
        {
            static CSync sync;
            sync.Lock();

            if (instance_ == NULL)
                instance_ = new T();

            sync.Unlock();

        }
        return instance_;
    }
};

template <typename T>
T* Singleton<T>::instance_ = NULL;

#endif // #ifndef _SINGLETON_H_

sync.h:

#ifndef _SYNC_
#define _SYNC_

#include <windows.h>

// critical_section
class CSync
{
private:
    void operator=(const CSync&);
    CSync(const CSync&);

    CRITICAL_SECTION critical_section_;

public:
    CSync() { InitializeCriticalSection(&critical_section_); }
    ~CSync() { DeleteCriticalSection(&critical_section_); }

    void Lock() { EnterCriticalSection(&critical_section_); }
    void Unlock() { LeaveCriticalSection(&critical_section_); }
};

#endif // #ifndef _SYNC_

test.cpp:

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

using namespace std;

class Mango
{
public:
    Mango() { cout << "Mango Constructor(). " << endl; }
};

int main()
{
    Mango* m1 = Singleton<Mango>::Instance();
    Mango* m2 = Singleton<Mango>::Instance();

    cout << m1 << "\n" << m2 << endl;

    return 0;
}

相关文章:

  • 用MDT 2012为企业部署windows 7(六)--Deploymentshare$常用文件夹介绍
  • 如何区分ripv1和ripv2?
  • Hadoop系列之九:Hadoop集群伪分布式模式的实现详解
  • 《C#线程参考手册》读书笔记(二):.NET中的线程
  • tomcat创建用户名
  • NO.52 使用禅道来进行产品管理
  • 分享:Jython设置默认编码
  • SAP中的权限与破解
  • jquery获取点击控件的绝对位置
  • 北京职工因支付房租,首次提取住房公积金时应提供哪些相关证明材料
  • 当调用 Remove 失效时 [C#]
  • Preftest性能测试工作室2012年资料汇总
  • 既有算法,何必亲自写作?
  • php之session文件回收
  • 陶哲轩实分析习题8.5.6
  • 时间复杂度分析经典问题——最大子序列和
  • 【comparator, comparable】小总结
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • Android框架之Volley
  • Babel配置的不完全指南
  • C++11: atomic 头文件
  • jQuery(一)
  • Js基础知识(四) - js运行原理与机制
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • js面向对象
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • spring cloud gateway 源码解析(4)跨域问题处理
  • Theano - 导数
  • win10下安装mysql5.7
  • 分布式事物理论与实践
  • 诡异!React stopPropagation失灵
  • 机器学习 vs. 深度学习
  • 前端技术周刊 2019-02-11 Serverless
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 一个完整Java Web项目背后的密码
  • gunicorn工作原理
  • ​Spring Boot 分片上传文件
  • ​Z时代时尚SUV新宠:起亚赛图斯值不值得年轻人买?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #Linux(帮助手册)
  • #stm32驱动外设模块总结w5500模块
  • #控制台大学课堂点名问题_课堂随机点名
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (Python) SOAP Web Service (HTTP POST)
  • (分布式缓存)Redis持久化
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (一)为什么要选择C++
  • *(长期更新)软考网络工程师学习笔记——Section 22 无线局域网
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .net core 微服务_.NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
  • .net 打包工具_pyinstaller打包的exe太大?你需要站在巨人的肩膀上-VC++才是王道
  • .net 后台导出excel ,word
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • @PreAuthorize注解
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)