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

企业建设网站方案友情链接怎么购买

企业建设网站方案,友情链接怎么购买,网站图片翻页怎么做,学做网页的网站目录 1. 单例模式介绍 2.单例模式实现 1. 单例模式介绍 有些时候我们在做 qt 项目的时候,要用到很多类. 例如我们用到的类有 A,B,C,D. 其中,A 是 B,C,D 中都需要用到的类,A 类非常的抢手. 但是,A 类非常的占内存,定义一个 A 对象需要 500M 内存,假如在 B,C,D 中都定义一个 A 类…

目录

1. 单例模式介绍

2.单例模式实现


 

1. 单例模式介绍

   有些时候我们在做 qt 项目的时候,要用到很多类. 例如我们用到的类有 A,B,C,D. 其中,A 是 B,C,D 中都需要用到的类,A 类非常的抢手. 但是,A 类非常的占内存,定义一个 A 对象需要 500M 内存,假如在 B,C,D 中都定义一个 A 类对象,对 内存的消耗是可想而知的.

所以 B,C,D 分别都定义一个 A 类对象是不可能的. 那么我们此时就希望: 能不能把 A 定义成"全局变量",然后这样子 B,C,D 类都能访问,并且整个程序就只有这一个 A?

答案是可以的,定义 A 的时候以单例模式定义即可

单例模式作为一种常用的软件设计模式,主要是用来保证系统中只有一个实例,例如一般一个程序中只有一 个日志输出实例,一个系统中只有一个数据库连接实例,这时候用单例模式非常合适。

单例模式用来做什么

正如之前所说,单例模式:

(1) 整个程序只有一个对象;

(2) 整个程序都能访问到它;

(3) 分为"懒汉模式"和"饿汉模式";

(4) "懒汉模式"是用到单例的时候才创建,否则不创建对象;

(5) "饿汉模式"是在程序启动时就需要创建变量;

懒汉模式是时间换空间,饿汉模式是空间换时间。

单例模式是在大型项目用到非常多的,例如:

(1) 一个日记记录类,必须整个程序只能有一个,假如有 2 个,在写日志文件时会相互"践踏".

(2) 数据库操作,连接类,必须整个程序只能有一个,假如有 2 个就会出问题,你想看假如 2 个进程同时使用 同一个账号,然后写入同一个数据会发生什么事情...

单例模式有效的解决了重复定义对象的问题,假如配合互斥锁,还可以解决多进程,线程之间的同步互斥问题, 也就是同一时间只能有一个进程操作单例对象。

2.单例模式实现

设计单例模式非常简单:

cpp文件实例:

//这句一定要写,因为 self 是静态变量,必须要初始化值
ClassA* ClassA::self = NULL;
ClassA *ClassA::getInstance()
{//判断是否是第一次调用//假如不为 NULL,会直接 returnif (self == NULL) {//防止多进程同时调用创建 2 个对象的问题//原理是因为是静态变量只会定义一次static QMutex mutex;//上锁QMutexLocker locker(&mutex);//在判断一次,防止其它进程抢先 new 过了if (self == NULL) {self = new ClassA;}}return self; //返回指针
}

h头文件实例:

class ClassA : public QObject
{Q_OBJECT
public://通过它获取 self 指针,这个函数是静态调用,不需要创建对象就可以访问static ClassA *getInstance(); //返回自身的指针//构造函数explicit ClassA(QObject *parent = 0);void hello(){ //一个普通函数qDebug() << "hello world";}
private:static ClassA *self; //静态指针
};
#endif // ICONFONT_H

在其他类里的调用方法:

ClassA::getInstance()->hello();

 其中:

     ClassA::getInstance()会获取全局的 self 指针,通过这个指针我们可以访问到里边的函数。在任何类里,都可以 无条件访问 A 对象,并且不需要创建 A 对象,而且 A 对象全局只有一个实例:

(1) 在类 A 里定义一个静态的指针 self;

(2) 当调用获取 A 对象的指针时,判断这个 self 是否为空,假如为空则创建新对象并赋值给 self 并返回 self,存 在则直接返回 self;

在此使用用的最多的"懒汉模式"进行演示:

cpp 代码如下(以数据库为例(多个 ui 界面都使用到此类)):

#include "qmqttclient.h"
#include <QMutex>
#include <QMutexLocker>
#include <QMessageBox>
//构造函数
QmqttClient::QmqttClient()
{}
//这句一定要写,因为 self 是静态变量,必须要初始化值
QmqttClient* QmqttClient::mqttSelf = NULL;
QmqttClient *QmqttClient::getInstance()
{//判断是否是第一次调用//假如不为 NULL,会直接 returnif (mqttSelf == NULL) {//防止多进程同时调用创建 2 个对象的问题//原理是因为是静态变量只会定义一次static QMutex mutex;//上锁 QMutexLocker 会锁住 mutex,当 QMutexLocker 被释放的时候自动解锁//locker 是局部变量,所以 getInstance 函数结束时会自动解锁QMutexLocker locker(&mutex);//在判断一次,防止其它进程抢先 new 过了if (mqttSelf == NULL) {mqttSelf = new QmqttClient;}}return mqttSelf; //返回指针
}

头文件

#ifndef QMQTTCLIENT_H
#define QMQTTCLIENT_H
#include <QObject>
#include "qmqtt.h"
#include <QtCore>
class QmqttClient : public QObject{Q_OBJECT
public://通过它获取 self 指针,这个函数是静态调用,不需要创建对像就可以访问,函数名
自定义//这个函数的作用是给别人获取它的静态对象 返回自身的指针static QmqttClient *getInstance();
// void hello(){ //一个普通函数
// qDebug() << "hello world";
private:QmqttClient(); //构造函数,写在 private 下,不允许 new 生成单例static QmqttClient *mqttSelf;//静态指针
};

在其他类里的调用方法:

QmqttClient::getInstance()->mqttClient->setHost(ui->lEditServerIP->text()); //服务 器 IP QmqttClient::getInstance()->mqttClient->setPort(1883);//端口号

 其中: QmqttClient::getInstance()会获取全局的 self 指针,通过这个指针我们可以访问到里边的函数. 在任何类里,都可以无条件访问 A 对象,并且不需要创建 A 对象,而且 A 对象全局只有一个实例: 注意:可以把多个对象放到单例模式

http://www.hkea.cn/news/572990/

相关文章:

  • 网站建设公司价格差别seo还有哪些方面的优化
  • 哪家公司建造了迪士尼乐园关键词优化推广排名多少钱
  • 做教育的网站有哪些内容吗湖南网站营销推广
  • wordpress 跳过ftp搜索引擎排名优化方案
  • 360做的网站北京营销推广公司
  • 我国政府网站建设的趋势宁波seo公司排名榜
  • 高端网站建设,恩愉科技专业的seo搜索引擎优化培训
  • 跨境网站开发公司网站seo思路
  • 冠县网站建设活动推广方案
  • 鲜花培训网站建设网站推广要点
  • 情趣内衣怎么做网站如何制作网页
  • 网站交互技术百度推广登陆后台
  • 网站的推广和宣传方式各行业关键词
  • 腾讯云服务器网站建设淘宝推广哪种方式最好
  • 大专网站建设论文找个免费的网站
  • 移动端网站开发流程图seopeix
  • 购物网站制作免费太原seo招聘
  • 怎么建设食品网站济南seo外包公司
  • 建设网站有哪些seopeix
  • 桂林市工程建设项目招标网站莆田百度快照优化
  • 金华网站建设大型网页建设农产品网络营销
  • wordpress free cdn长沙百度快速优化
  • 网页界面设计首页seo快速优化软件网站
  • 和凡科网类似的网站四川省人民政府
  • 北辰网站建设如何推广引流
  • ps网页模板网站seo外包公司
  • 常平镇仿做网站快速排名刷
  • 青浦建设网站公司app推广代理加盟
  • wordpress 在线pdf优化关键词的正确方法
  • 网站悬浮窗口网站关键词全国各地的排名情况