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

c++实现Qt对象树机制

文章目录

  • 对象树是什么
  • 使用对象树的好处
  • 使用c++实现对象树

对象树是什么

 我们常常听到 QObject 会用对象树来组织管理自己,那什么是对象树?
 这个概念非常好理解。因为 QObject 类就有一个私有变量 QList<QObject *>,专门存储这个类的子孙后代们。比如创建一个 QObject 并指定父对象时,就会把自己加入到父对象的 childre() 列表中,也就是 QList<QObject *> 变量中。

使用对象树的好处

 好处就是:当父对象被析构时子对象也会被析构。
 举个例子,有一个窗口 Window,里面有 Label标签、TextEdit文本输入框、Button按钮这三个元素,并且都设置 Window 为它们的父对象。这时候我做了一个关闭窗口的操作,作为程序员的你是不是自然想到将所有和窗口相关的对象析构啊?古老的办法就是一个个手动 delete 呗。是不是很麻烦?Qt 运用对象树模式,当父对象被析构时,子对象自动就 delete 掉了,不用再写一大堆的代码了。
 所以,对象树在 GUI 编程中是非常非常有用的。

使用c++实现对象树

 我们知道Qt对象在创建的时候都可以指定一个父指针,Qt就是通过这个操作将子对象添加到父对象的容器中进行管理,当父对象析构的时候就会遍历这个容器对子对象进行析构,这样子的话用户就不需要自己进行析构子对象。


#include <iostream>
#include <list>
using namespace std;
class Object;
typedef list<Object *> ObjectList;class Object
{
public:ObjectList children_list;Object(Object *parent = nullptr){if(parent){parent->children_list.push_back(this);}}virtual ~Object(){for(auto it = children_list.begin();it != children_list.end();it++){delete *it;}}
};class A:public Object
{
public:A(Object *parent):Object(parent){cout<<"A的构造函数被执行了"<<endl;}~A(){cout<<"A的析构函数被执行了"<<endl;}
};class B:public Object
{
public:B(Object *parent):Object(parent){cout<<"B的构造函数被执行了"<<endl;}~B(){cout<<"B的析构函数被执行了"<<endl;}
};int main()
{Object obj;A *a = new A(&obj);return 0;
}

在这里插入图片描述
当obj对象析构后,a对象不需要进行delete就可以自动进行析构。

http://www.lryc.cn/news/110150.html

相关文章:

  • 骨传导蓝牙耳机排行榜,精选五款排名最靠前的耳机
  • JDBC用法小结
  • MySQL 数据表在什么情况下容易损坏
  • 【设计模式——学习笔记】23种设计模式——访问者模式Visitor(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • Ubuntu安装MySQL 8.0与Navicat
  • GB28181智慧可视化指挥控制系统之执法记录仪设计探讨
  • 【SpringBoot】自动配置自动加载controller的原理
  • Docker Enable live
  • 9.物联网操作系统之软件定时器
  • Windows Server 2012 R2 安装 Oracle RAC 11g R2
  • 本地shell无法连接ubuntu,解决办法?
  • 关于openwrt的802.11w 管理帧保护使用
  • centos手动离线安装php,nginx
  • Java基础六 - Collection集合List、Set、Queue,Map
  • k8s nginx+ingress 配置
  • 探索Streamlit中强大而灵活的 st.write() 函数(五):构建丰富多样的应用界面
  • LinAlgError: Singular matrix 问题解决
  • 【ASP.NET MVC】使用动软(五)(13)
  • MongoDB面试题
  • Python Web 开发 Flask 介绍
  • 本地mvn仓库清理无用jar包
  • MySQL的常用函数大全
  • 一百四十三、Linux——Linux的CentOS 7系统语言由中文改成英文
  • 一 关于idea如何在svn进行项目下载并运行成功
  • python使用selenium 打开谷歌浏览器闪退, 怎么解决
  • .net 6 efcore一个model映射到多张表(非使用IEntityTypeConfiguration)
  • CISCO MDS 9148 SAN Switch 交换机命令配置方法:
  • 图的深度、广度优先探索(数据结构)
  • c语言小知识点
  • C++ - 模板分离编译