wordpress多站點無css百度推廣競價排名
文章目錄
- 對象樹是什么
- 使用對象樹的好處
- 使用c++實現(xiàn)對象樹
對象樹是什么
?我們常常聽到 QObject 會用對象樹來組織管理自己,那什么是對象樹?
?這個概念非常好理解。因為 QObject 類就有一個私有變量 QList<QObject *>,專門存儲這個類的子孫后代們。比如創(chuàng)建一個 QObject 并指定父對象時,就會把自己加入到父對象的 childre() 列表中,也就是 QList<QObject *> 變量中。
使用對象樹的好處
?好處就是:當父對象被析構(gòu)時子對象也會被析構(gòu)。
?舉個例子,有一個窗口 Window,里面有 Label標簽、TextEdit文本輸入框、Button按鈕這三個元素,并且都設(shè)置 Window 為它們的父對象。這時候我做了一個關(guān)閉窗口的操作,作為程序員的你是不是自然想到將所有和窗口相關(guān)的對象析構(gòu)啊?古老的辦法就是一個個手動 delete 唄。是不是很麻煩?Qt 運用對象樹模式,當父對象被析構(gòu)時,子對象自動就 delete 掉了,不用再寫一大堆的代碼了。
?所以,對象樹在 GUI 編程中是非常非常有用的。
使用c++實現(xiàn)對象樹
?我們知道Qt對象在創(chuàng)建的時候都可以指定一個父指針,Qt就是通過這個操作將子對象添加到父對象的容器中進行管理,當父對象析構(gòu)的時候就會遍歷這個容器對子對象進行析構(gòu),這樣子的話用戶就不需要自己進行析構(gòu)子對象。
#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的構(gòu)造函數(shù)被執(zhí)行了"<<endl;}~A(){cout<<"A的析構(gòu)函數(shù)被執(zhí)行了"<<endl;}
};class B:public Object
{
public:B(Object *parent):Object(parent){cout<<"B的構(gòu)造函數(shù)被執(zhí)行了"<<endl;}~B(){cout<<"B的析構(gòu)函數(shù)被執(zhí)行了"<<endl;}
};int main()
{Object obj;A *a = new A(&obj);return 0;
}
當obj對象析構(gòu)后,a對象不需要進行delete就可以自動進行析構(gòu)。