如果需要一个全局对象,如对话框、系统日志、显卡等设备的驱动程序对象、一台PC连接一个键盘等。这样的全局对象只能是一个且是全局的,这就是单例模式,如何实现呢?

1 不能在类外部通过构造函数新建对象:构造函数的访问方式设置为private或protected。同时,拷贝构造函数和赋值运算符也是私有的,以禁止拷贝和赋值。

2 能够通过调用一个成员函数来实例化一个对象:成员函数设置为static,这样可以在没有对象存在的情形下通过类名来调用这一成员函数;

3 需要确保上述成员函数在对象已经存在的情形下不再创建新对象:增加一个本类指针的static数据成员作为条件变量。

如果是多线程,还是可能创建多个实例,需要进行Lock操作(如Boost库支持此操作)。

#include using namespace std;class Singleton{public:    static Singleton *GetInstance() // 静态成员函数构造一个实例    {// Lock(); // 多线程时(Boost库支持Lock操作)        if (m_Instance == NULL)        {            m_Instance = new Singleton(); // ①        }// UnLock();// static Singleton m_Instance;  // ② 多线程时        return m_Instance;// return const_cast (m_Instance); // ③ 常量对象只有一次创建的机会    }    static void DestoryInstance()    {        if (m_Instance != NULL )        {            delete m_Instance;            m_Instance = NULL ;        }    }    // This is just a operation example    int GetTest()    {        return m_Test;    }private:    Singleton(){ m_Test = 10; } // 构造函数私有  Singleton::Singleton(const Singleton&) {} // 拷贝构造函数私有  Singleton &Singleton::operator=(const Singleton&) {} // 赋值运算符私有    static Singleton* m_Instance; // 静态数据成员用于判断是否存在类实例    int m_Test; // used for test};Singleton *Singleton ::m_Instance = NULL;int main(int argc , char *argv []){    Singleton *singletonObj = Singleton ::GetInstance();    cout<GetTest()<

一般的编程观念是,new操作需要和delete操作进行匹配;上述的实现中,添加了一个DestoryInstance的static函数,这也是最简单,最普通的处理方法了;但是,很多时候,很容易忘记调用DestoryInstance函数,就像你忘记了调用delete操作一样。由于怕忘记delete操作,所以就有了智能指针;那么,在单例模型中,没有“智能单例”,怎么办?

在实际项目中,特别是客户端开发,其实是不在乎这个实例的销毁的。因为,全局就这么一个变量,全局都要用,它的生命周期伴随着软件的生命周期,软件结束了,它也就自然而然的结束了,因为一个程序关闭之后,它会释放它占用的内存资源的,所以,也就没有所谓的内存泄漏了。但是,有以下情况,是必须需要进行实例销毁的:

如果类中有一些文件锁、文件句柄、数据库连接等,这些随着程序的关闭而不会立即关闭的资源,必须要在程序关闭前,进行手动释放。

定义一个供单例类使用的内部GC类,用来释放资源。由于程序在结束的时候,系统会自动析构所有的全局变量,实际上,系统也会析构所有类的静态成员变量,就像这些静态变量是全局变量一样。我们知道,静态变量和全局变量在内存中,都是存储在静态存储区的,所以在析构时,是同等对待的。

#include using namespace std;class Singleton{public:    static Singleton *GetInstance()    {        return m_Instance;    }    int GetTest()    {        return m_Test;    }private:    Singleton(){ m_Test = 10; }    static Singleton *m_Instance;    int m_Test;    class GC    {    public :        ~GC()        {            // We can destory all the resouce here, eg:db connector, file handle and so on            if (m_Instance != NULL )            {                cout<< "Here is the test" <GetTest()<

ref:

https://www.cnblogs.com/ring1992/p/9592817.html

-End-

abstract类中可以有private的成员_C++|static成员与单例模式相关推荐

  1. C++类中的static数据成员,static成员函数

    文章转自:http://www.cnblogs.com/gysm/archive/2011/09/16/2179277.html 版权归原作者. C++类中谈到static,我们可以在类中定义stat ...

  2. C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28)

    C++深度解析 类中的函数重载 -- 全局函数,普通成员函数,静态成员函数(28) 函数重载的回顾 函数重载的本质为相互独立的不同函数 C++中通过函数名和函数参数确定函数调用 无法直接通过函数名得到 ...

  3. abstract类中不可以有private的成员_别再说你不懂java面向对象了,阿里P7大佬一次性给你讲的明明白白

    前言 面向对象在百度百科中是这样解释的:"面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物".说的好像很流弊的样子,看看就行. 包的认识 1.1:包 ...

  4. abstract类中不可以有private的成员_我要告诉你:java接口中可以定义private私有方法...

    在传统的Java编程中,被广为人知的一个知识点是:java Interface接口中不能定义private私有方法.只允许我们定义public访问权限的方法.抽象方法或静态方法.但是从Java 9 开 ...

  5. abstract类中不可以有private的成员_C++类成员的三种访问权限:public/protected/private...

    1.访问限定符 C++ 通过 public.protected.private 三个关键字来控制成员变量和成员函数的访问权限(也称为可见性),分别表示:公有的.受保护的.私有的. class 2.访问 ...

  6. abstract类中不可以有private的成员_C++中public、protected、private的区别

    1.访问范围 private:只能由该类的成员函数.友元的成员函数访问,不能被其他类的成员函数访问,即使是该类的对象也不能直接访问 protected:可以被该类中的成员函数访问.子类中的成员函数访问 ...

  7. abstract类中不可以有private的成员_C++ 类:声明成员函数与实现

    接上文... 16.3类的成员 2.成员函数 1.构造函数 ... 2.拷贝构造函数 有了类的构造函数我们就可以创建类的实例了,下图中分别使用不同的构造函数一共创建了4个动物的对象,现在程序中就有4个 ...

  8. abstract类中不可以有private的成员_UML类图还不懂?来看看这版乡村爱情类图,一把学会!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.码场心得 有个词叫内卷严重! 最开始听到这个词是有个小伙伴在我的一篇HashMap源码分析 ...

  9. [转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

最新文章

  1. problem-solving-with-algorithms-and-data-structure-usingpython(使用python解决算法和数据结构) -- 基本数据结构(二)...
  2. spark调优(一)-开发调优,数据倾斜,shuffle调优
  3. 网络攻击与防御技术第三次实验
  4. 成功解决ERROR: Unable to find the development tool `make` in your path; please make sure that you have t
  5. string的常见用法详解
  6. 触发器无法启动分布式事务。
  7. educoder 使用线程锁(lock)实现线程同步_Python并行编程(二):多线程锁机制利用Lock与RLock实现线程同步
  8. python socket编程_Python学习记录-socket编程
  9. [web]EL表达式失效
  10. c语言sizeof输出单位,急,求大神!C语言中sizeof问题
  11. TI 库仑计高级篇之Chemistry 创建
  12. 读《About Face 4 交互设计精髓》2
  13. Java 实现 图片OCR文字识别
  14. python numpy 计算标准差
  15. 计算机课程 图层关系认识 课件,PhotoShop系列视频讲座(八讲)
  16. 全国计算机等级一级b真题,2011年3月全国计算机等级考试一级B真题及参考答案.doc...
  17. RAP2本地开发环境部署
  18. 浏览器标签页形式运行【js代码】,小书签
  19. vue-devtools安装教程 附各种常见错误处理(图标不显示 图标显示控制台没用Vue选项卡)
  20. 深度学习——Metal artifact reduction

热门文章

  1. 《Spring》(十六)---- JDBC
  2. Fly.Box天禾云盘2016双11超级钜惠,超低折扣!!!
  3. Oracle 直方图理论
  4. c#自动更新+安装程序的制作
  5. 之前接触过的测试的相关工具
  6. Silverlight中全屏处理
  7. linux的常用操作——静态库
  8. 【计算机网络复习 物理层】2.2 物理传输介质
  9. 查看屏幕大小_疑似“iPhone 12” 的OLED屏幕组件泄露
  10. 计算机综合应用实验,计算机综合应用实验二WORD应用.doc