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

如果需要一个全局对象,如对话框、系统日志、显卡等设备的驱动程序对象、一台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

dc3bcebc085824b868e7999ded2213e6.png

-End-

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/501672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JAVA入门级教学之(JDK安装-JDK、JRE、JVM)

1.下面我们开支安装JDK【JDK开源、免费】 安装地址&#xff1a;https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 选择 Windows x64-->jdk-8u221-window-x64.exe 下载 下载完成后 双击JDK安装包-->进入安装界面&#xff08;…

vim显示python嵌套级_在Vim中为Python突出显示语法

Vim中针对Python的语法突出显示(目标是Ubuntu 12.10)这是有关如何在Ubuntu 12.10的Python中设置语法突出显示的演练。 你所看到的就是你得到的&#xff1a;[https://github.com/sentientmachine/Pretty-Vim-Python/]一旦掌握了如何为特定用户将配色方案和语法突出显示注入到vi编…

JAVA入门级教学之(编写第一个HelloWorld程序)

目录 1.创建一个HelloWorld.java文件 2.用记事本打开HelloWorld.java 3.接下来我们要完成xxx.java-->xxx.class的步骤 怎么解决javac不可用的问题&#xff1a; 4.配置环境变量path 怎么配环境变量Path&#xff1f; 5.接下来就是在DOS命令窗口下进行编译【javac java源…

springboot api文档_SpringCloud/SpringBoot - 自动生成API文档

SpringCloud/SpringBoot 的项目一定要前后分离&#xff0c;这就需要一个API文档生成的工具&#xff0c;后端一定要和前端或者是移动端对接接口&#xff0c;那么问题来了&#xff0c;接口是不是要自己写给他们看&#xff0c;一般的会采用Excel或者Word来写&#xff0c;高级一点的…

JAVA入门级教学之(classpath的配置)

目录 JAVA入门级教学之&#xff08;classpath的配置&#xff09; 1.打开DOS命令窗口&#xff0c;执行java HelloWorld 2.疑问&#xff1f;&#xff1a;为什么会出现找不到HelloWorld.class文件&#xff1f; 3.解释&#xff1a; JAVA入门级教学之&#xff08;classpath的配置…

语法手册_程序员必备——SQL语法速成手册

一、基本概念数据库术语数据库(database) - 保存有组织的数据的容器(通常是一个文件或一组文件)。数据表(table) - 某种特定类型数据的结构化清单。模式(schema) - 关于数据库和表的布局及特性的信息。模式定义了数据在表中如何存储&#xff0c;包含存储什么样的数据&#xff0…

JAVA入门级教学之(JAVA注释)

目录 JAVA入门级教学之&#xff08;JAVA注释&#xff09; 1.关于java源程序中的注释&#xff1a; 2.java中的注释怎么写&#xff1f; JAVA入门级教学之&#xff08;JAVA注释&#xff09; 1.关于java源程序中的注释&#xff1a; 什么是注释&#xff1f;注释的作用是什么&…

JAVA入门级教学之(你是否理解HelloWorld的这段经典的代码的注释)

//public表示公开的 //class表示一个类 //HelloWorld表示一个类名public class HelloWorld{//表示一个公开的类&#xff0c;类名是HelloWorld//在这个大括号内写的是类体&#xff0c;类体中不能直接编写java语句【除声明变量之外】&#xff0c;否则会报错/*public表示公开的sta…

devtools的ctrl加r_Chrome DevTools调试技巧

【1】DevTools触发伪类右键单击Elements面板中的元素节点并选择“ force state ”。或者在Sytle子窗格中单击“&#xff1a;hov ”图标。可以触发元素上的伪类来研究元素在悬停时的效果和样式​【2】DevTools-在任何网页上运行预定义的代码片段DevTools中有一个叫做代码段的特性…

JAVA入门级教学之(public class和class的区别)

目录 JAVA入门级教学之&#xff08;public class和class的区别&#xff09; 1.public class 和 class 的区别&#xff1a; 2.public class 类名A{ }的 类名A需要和源文件 类名 保持一致 总的来说&#xff1a; JAVA入门级教学之&#xff08;public class和class的区别&…

c 程序中的注释相当于空白字符_Python专题 | (三)注释、变量与输出

小伙伴们&#xff0c;大家好呀&#xff0c;欢迎回到我们的python专题。前两篇文章已经把编程简单的知识和大家介绍过了&#xff0c;今天我们正式开始学习python语法。第一个python程序我们在第一篇文章中介绍pycharm的安装时曾给大家展示过这样的一段代码&#xff1a;print(&qu…

JAVA入门级教学之(第一章总结)

总结第一章需要掌握的内容&#xff1a; 理解java的加载与执行能理解自己搭建的java开发环境&#xff08;JDK&#xff09;能够独立编写HelloWorld程序&#xff0c;编译并运行掌握环境变量path的原理以及如何配置掌握环境变量classpath的原理以及如何配置java中的注释public cla…

JAVA入门级教学之(标识符与关键字)

目录 JAVA入门级教学之&#xff08;标识符与关键字&#xff09; 1.什么是标识符&#xff1f; 2.标识符的命名规则&#xff1f; 3.标识符的命名规范&#xff1f; 4.严格遵守规则和规范: 在java里的关键字都是小写的 JAVA入门级教学之&#xff08;标识符与关键字&#xff09; 1.什…

birt project mysql_eclipse birt如何连接mysql数据库 配置文件

双击.rptdesign打开data explorer,右键点Data Sources -> New Data Sources ->JDBC Data Source到Next如果没有mysql-connector-java的包&#xff0c;请去下一个http://dev.mysql.com/downloads/connector/j/5.0.html然后在Driver Class这里就可以选 com.mysql.jdbc.Driv…

JAVA入门级教学之(变量)

目录 关于java语当中的变量&#xff1a; 1、什么是变量&#xff1f; 2、数据类型的作用&#xff1f; 3、变量要求 4、声明/定义变量的语法格式&#xff1a; 5、变量声明之后怎么赋值&#xff1f; 6、声明和赋值可以放到一起完成 7、变量赋值之后&#xff0c;可以重新赋值&…

mysql添加timestamp有什么用_mysql中timestamp的使用

mysql中timestamp的使用mysql> CREATE TABLE t1 (-> id mediumint(9) NOT NULL auto_increment,-> name char(11) default NULL,-> rq timestamp default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,-> PRIMARY KEY (id)-> ) ;Query OK, 0 rows…

JAVAWEB企业级开发关于Tomcat的安装和配置

首先&#xff0c;我们来了解一下什么是JSP:动态网页 静态&#xff1a;规定不会变化 动态&#xff1a;随着时间、地点、用户操作改变而改变 1.动态网页&#xff1a; 需要使用到 服务器端脚本语言(JSP) 2.使用的架构&#xff1a; CS:Client Server 不足…

mysql中设置字符_MySQL中设置默认字符集的方法

对于默认字符集&#xff0c;让我们看一下语法-CREATE DATABASE IF NOT EXISTS yourDatabaseNameDEFAULT CHARACTER SET utf8DEFAULT COLLATE utf8_general_ci;让我们实现以上语法以设置默认字符集UTF8-CREATE DATABASE IF NOT EXISTS instant_app-> DEFAULT CHARACTER SET u…

mysql api 连接池_SpringBoot-整合HikariCP连接池

HikariCP连接池概述池化思想 池化思想是我们项目开发过程中的一种非常重要的思想&#xff0c;如整数池&#xff0c;字符串池&#xff0c;对象池、连接池、线程池等都是池化思想的一种应用&#xff0c;都是 通过复用对象&#xff0c;以减少因创建和释放对象所带来的资源消耗&…

JAVAWEB入门tomcat服务器配置

1.配置&#xff1a; 部署项目的方式&#xff1a; 一、直接新建一个项目hello文件放到webapps目录下即可 C:\apache-tomcat-8.5.45\webapps\hello 再在hello文件中编辑hello.html 测试内容如下 <font colorred>hellotomcat </font> 接下来在网页的搜索栏输入 …