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

安徽省安徽省建设工程信息网站/公司网站建设代理

安徽省安徽省建设工程信息网站,公司网站建设代理,漯河企业网站建设公司,网站建设业务员的工作总结及计划目录 前言正文一、理论介绍1、QPointer2、QScopedPoint3、QSharedPoint4、QWeakPoint 二、实战演练1、QPoint2、QScopedPoint3、QSharedPointa、示例一b、示例二 4、QWeakPoint END、总结的知识与问题 参考 前言 智能指针的使用,对很多程序员来说,都算是…

目录

  • 前言
  • 正文
    • 一、理论介绍
      • 1、QPointer
      • 2、QScopedPoint
      • 3、QSharedPoint
      • 4、QWeakPoint
    • 二、实战演练
      • 1、QPoint
      • 2、QScopedPoint
      • 3、QSharedPoint
        • a、示例一
        • b、示例二
      • 4、QWeakPoint
    • END、总结的知识与问题
  • 参考

前言

智能指针的使用,对很多程序员来说,都算是比较高深的存在,但又老是感觉这是一个值得去掌握,且需要去掌握的东西,所以,这次下定决心,来掌握一下Qt的智能指针的使用,当然,最常用的肯定是QSharedPoint这个了,其他的应该也就是顺带着讲一讲,并且,普及一些知识,从而让自己的能力更上一层楼把。

正文

一、理论介绍

1、QPointer

QPointer是Qt提供的空安全的智能指针,它用于解决悬挂指针的问题。QPoint在对象被删除后,会自动被设置为nullptr,避免访问已经无效的对象,它类似于普通指针,但提供了一些安全检查。

总结来说就是:

当你创建一个对象,然后使用QPointer指向这个对象,若出现delete 了那个对象,但是未将那个对象置空的情况的话,判断的时候,直接判断QPointer对象,就可以知道到底是真的删除了那个对象,还是假的删除了。避免了悬挂指针的问题。

QPoint 充当一个管家的角色,对真正的指针做好判断。

2、QScopedPoint

QScopedPoint 是Qt提供的独占式的智能指针,用于管理动态分配的对象,QScopedPoint 在超出作用域时,自动删除对象,确保对象在不再需要时,被正确释放。

3、QSharedPoint

QSharedPoint 是Qt提供的共享引用计数的指针,可用于管理动态分配的对象。它通过引用计数跟踪对象的引用次数,当引用次数归零时,会自动删除对象。可以通过多个QSharedPoint共享同一个对象,对象会在最后一个引用者释放它时,才会被删除。

4、QWeakPoint

QWeakPoint 是Qt提供的弱引用智能指针,用于解决循环引用的问题。QWeakPoint 可以引用由QSharedPoint管理的对象,但不会增加引用计数的次数。QWeakPoint需要转换成QSharedPoint才能访问对象,当引用计数为0时,访问会失败。

二、实战演练

1、QPoint

MyClass.h

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QPointer>
#include <QDebug>
class MyClass : public QObject
{Q_OBJECTpublic:MyClass(const QString& name): m_name(name){qDebug() << "MyClass 构造函数,名称为:"<<m_name;}~MyClass(){qDebug() << "MyClass 析构函数,名称为:"<<m_name;}QString getName() const {return m_name;}private:QString m_name;
};#endif // MYCLASS_H

main.cpp

#include <QCoreApplication>
#include <QPointer>
#include <QDebug>
#include "MyClass.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);MyClass *obj = new MyClass("test");QPointer<MyClass> myObject(obj);if (myObject){qDebug() << "对象存在,名称为" << myObject->getName();}else{qDebug() << "对象不存在";}delete obj;if (myObject){qDebug() << "对象存在,名称为" << myObject->getName();}else{qDebug() << "对象不存在";}return a.exec();
}

2、QScopedPoint

void MainWindow::TestQScopedPointer()
{useResource();qDebug() << "useResource 函数执行完毕";
}void MainWindow::useResource()
{QScopedPointer<Resource> scopedResource(new Resource());;//执行一些操作,使用资源qDebug() << "---> 使用资源 ";
}

QScopedPoint 在适当的时候,会自动调用析构函数释放资源。

结果:

Resource 构造函数
---> 使用资源 
Resource 析构函数
useResource 函数执行完毕

3、QSharedPoint

a、示例一
#include <QSharedPointer>
#include <QScopedPointer>
#include <QDebug>
// 假设的图形对象类
class GraphicObject {
public:GraphicObject() { qDebug() << "GraphicObject created"; }~GraphicObject() { qDebug() << "GraphicObject destroyed"; }// 具体的图形对象操作
};
// 文档对象类
class Document {
public:Document() { qDebug() << "Document created"; }~Document() { qDebug() << "Document destroyed"; }// 添加图形对象到文档void addGraphicObject(QSharedPointer<GraphicObject> graphicObject) {graphicObjects.append(graphicObject);}// 具体的文档操作
private:QList<QSharedPointer<GraphicObject>> graphicObjects;
};
int main() {// 使用 QSharedPointer 确保图形对象的自动释放QSharedPointer<GraphicObject> graphicObject(new GraphicObject);// 使用 QScopedPointer 确保文档对象的自动释放QScopedPointer<Document> document(new Document);// 将图形对象添加到文档document->addGraphicObject(graphicObject);// 注意:在这里,graphicObject 和 document 会在适当的时候自动释放return 0;
}
b、示例二
#ifndef MYSHAREDCLASS_H
#define MYSHAREDCLASS_H
#include <QPointer>
#include <QDebug>
class MySharedClass : public QObject
{Q_OBJECTpublic:MySharedClass(int value): m_iValue(value){qDebug() << "MySharedClass 构造函数,值为:"<<m_iValue;}~MySharedClass(){qDebug() << "MySharedClass 析构函数,值为:"<<m_iValue;}void setValue(int value){m_iValue = value;}int getValue() const{return m_iValue;}private:QString m_name;int m_iValue;
};
#endif // MYSHAREDCLASS_H
void MainWindow::TestSharedPointer()
{//先用一个智能指针指向一个对象QSharedPointer<MySharedClass> pointer1(new MySharedClass(10));{//通过复制构造函数 让引用+1QSharedPointer<MySharedClass> pointer2 = pointer1;qDebug() << "---> pointer1 的值:"<<pointer1->getValue();qDebug() << "---> pointer2 的值"<<pointer2->getValue();//实际上都是对同一个对象进行操作pointer2->setValue(20);qDebug() << "--->w pointer1 的值:"<<pointer1->getValue();qDebug() << "--->w pointer2 的值"<<pointer2->getValue();}qDebug() << "--->w pointer1 的值:"<<pointer1->getValue();//之后,智能指针超出作用域之后,会自动析构掉
}

4、QWeakPoint

#ifndef MYWEAKCLASS_H
#define MYWEAKCLASS_H#include <QSharedPointer>
#include <QWeakPointer>
#include <QDebug>class ObjectB;class ObjectA
{
public:ObjectA(const QString& name) : m_name(name){}~ObjectA(){qDebug() << "objectA 析构函数,名称为:"<<m_name;}void setObjectB(const QSharedPointer<ObjectB> &objectB){m_objectB = objectB;}
private:QString m_name;QWeakPointer<ObjectB> m_objectB;
};class ObjectB
{
public:ObjectB(const QString& name): m_name(name){}~ObjectB(){qDebug() << "Object 析构函数,名称为:"<<m_name;}void setObjectA(const QSharedPointer<ObjectA> &objectA){m_objectA = objectA;}private:QString m_name;QSharedPointer<ObjectA> m_objectA;
};#endif // MYWEAKCLASS_H
void MainWindow::TestWeakPointer()
{QSharedPointer<ObjectA> objectA(new ObjectA("ObjectA"));QSharedPointer<ObjectB> objectB(new ObjectB("ObjectB"));objectA->setObjectB(objectB);objectB->setObjectA(objectA);qDebug() << "程序结束";
}

END、总结的知识与问题

参考

1、[Qt杂谈8.浅谈Qt智能指针那些事](https://www.cnblogs.com/luoxiang/p/17927569.html)

http://www.jmfq.cn/news/5342761.html

相关文章:

  • 网站的建设模式是指什么/游戏广告联盟平台
  • 网站建设公司好做吗/推广策略
  • 无锡集团网站建设/深圳网络公司推广公司
  • 西安网站建设网站建设/十大小说网站排名
  • 网站建设设计师的工作内容/国外引流推广软件
  • 广州网站建设设计公司信息/企业邮箱怎么申请
  • 如何写网站建设方案/百度搜索风云榜小说
  • 山东地产网站建设/本地建站软件有哪些
  • 网站建设与网站优化销售/注册公司
  • 网站建设留言板怎么做/怎么上百度推广产品
  • 网站建设的成本与费用有哪些/百度网站推广排名优化
  • 汽车建设网站/seo秘籍优化课程
  • 武汉三网合一网站建设/app开发工具
  • 网站建设可行性分析报告/图片识别搜索引擎
  • 怎样免费设计网站建设/各种网站
  • 北京网站建设116net/西安seo优化培训
  • 学院评估+++网站建设整改/深圳seo优化推广公司
  • 安徽网站建设合肥网站建设/北京网站建设制作公司
  • 建设服装网站目的/长尾关键词举例
  • 网站建设 技术支持/友情链接的英文
  • 网站建设做的快/百度一下百度网页官
  • 安徽省外经建设集团有限公司网站/业务网站制作
  • 网站建设美国/百度云网页版登录入口
  • 襄州区住房和城乡建设局网站/网站排名首页
  • 潮州市住房和城乡建设局网站/怎么投稿各大媒体网站
  • 青岛上市公司网站建设/100种找客户的方法
  • 网站YYQQ建设/合肥seo整站优化网站
  • 网站建设和网站编辑是什么工作/百度信息流广告位置
  • 餐饮 公司 网站建设/交换友情链接时需要注意的事项
  • 建设银行卡如何网站激活/竞价排名是什么