博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之单例模式
阅读量:7091 次
发布时间:2019-06-28

本文共 1816 字,大约阅读时间需要 6 分钟。

#include 
#include
#include
class TestClass;template
class CSingleton{public: static T& Instance();};template
T& CSingleton
::Instance(){ //注意这里模板的写法 static std::auto_ptr
s_instance; static std::mutex m_mutex; auto temp1 = s_instance.get(); if (s_instance.get() == NULL){ std::unique_lock
lock(m_mutex); //! 加锁避免同时被创建两个实例 //! CUiSingleton
作用域下互斥量,不需要担心不同类型之间的互斥 if (s_instance.get() == NULL){ // 第二次判断的目的在于不被多线程重复创建 s_instance = std::auto_ptr
(new(T)); } } return *s_instance.get();}class TestClass: public CSingleton
{public: void fun(){ std::cout << "继承单例类" << std::endl; }};int main(){ CSingleton
::Instance().fun(); system("pause"); } //使用

class MyClass : public CSingleton<MyClass>

{
friend class CSingleton<MyClass>;
 private:
MyClass() {}
public:
 ...
 };

 

 今天在看的时候忽然想起了静态成员变量的初始化问题,之所以静态成员变量要在类外初始化的原因,就是要保证静态成员变量在程序启动时就初始化完成

静态成员的提出是为了解决数据共享的问题。实现共享有许多方法,如:设置全局性的变量或对象是一种方法。但是,全局变量或对象是有局限性的

在类中,静态成员可以实现多个对象之间的数据共享,并且使用静态数据成员还不会破坏隐藏的原则,即保证了安全性。因此,静态成员是类的所有对象中共享的成员,而不是某个对象的成员。

template 
class CSingleton : private CNoncopyable { public: // 访问单件的唯一方式 static T& Instance(); protected: CSingleton() {} static std::unique_ptr
s_instance_; static std::mutex mutex_; }; template
std::unique_ptr
CSingleton
::s_instance_; template
std::mutex CSingleton
::mutex_;

 update:

这里为什么使用的类要用友元函数及构造函数一定要private

首先说明我上面写的TestClass严格来说是错误的,因为要使用单例类就要保证只有在单例的Instance()这个函数里才能初始化,而构造函数不声明为private或标志delete,则类可以随意的生产对象

第二点,友元函数是为了父类nstance构造对象时,可以调用子类私有的构造函数,才能保证对象构造成功

转载于:https://www.cnblogs.com/wangshaowei/p/8952317.html

你可能感兴趣的文章
前端必备,50 个 Chrome Developer Tools 必备技巧
查看>>
客户故事:4家银行如何打造新一代移动金融中心
查看>>
NDK开发中这些基本知识你都懂吗
查看>>
自动化运维工具ansible的实践
查看>>
一个22万张NSFW图片的鉴黄数据集?我有个大胆的想法……
查看>>
do 一下来了一个 redux
查看>>
Vue教程09:双向绑定对象中属性原理
查看>>
如何实现VM框架中的数据绑定
查看>>
关于this
查看>>
[译] 系列教程:选择准备安装的 TensorFlow 类型
查看>>
Webhook到底是个啥?
查看>>
Flutter学习 ---- TravisCI加持
查看>>
借用UAC完成的提权思路分享
查看>>
『中级篇』 Linux网络命名空间(25)
查看>>
JS计算精度小记
查看>>
js的各种距离计算(较全)
查看>>
微信小程序异步API为Promise简化异步编程
查看>>
关于java泛型大大小小的那些事
查看>>
此面试题版本落后-请勿观看
查看>>
Stream流与Lambda表达式(三) 静态工厂类Collectors
查看>>