Qt / 对象树
一、什么是對象樹?
我們常常聽到 QObject 會用對象樹來組織管理自己,那什么是對象樹?
這個概念非常好理解。因為 QObject 類就有一個私有變量 QList<QObject *>,專門存儲這個類的子孫后代們。比如創建一個 QObject 并指定父對象時,就會把自己加入到父對象的 childre() 列表中,也就是 QList<QObject *> 變量中。
二、使用對象樹模式有什么好處?
好處就是:當父對象被析構時子對象也會被析構。
舉個例子,有一個窗口 Window,里面有 Label 標簽、TextEdit 文本輸入框、Button 按鈕這三個元素,并且都設置 Window 為它們的父對象。這時候我做了一個關閉窗口的操作,作為程序員的你是不是自然想到將所有和窗口相關的對象析構啊?古老的辦法就是一個個手動 delete 唄。是不是很麻煩?Qt 運用對象樹模式,當父對象被析構時,子對象自動就 delete 掉了,不用再寫一大堆的代碼了。
所以,對象樹在 GUI 編程中是非常非常有用的。
三、注意構建 / 析構?QObject 的順序問題
正常情況下,最后被創建出來的會先被析構掉。就好比我有一個大桌子,上面先擺放一個盤子,再擺放一個碗。當我要把桌子撤掉的時候,會先撤掉碗,再撤掉盤子,最后撤掉桌子。
用代碼來演示一下:
正常情況
int main() {QWidget window;QPushButton quit("Quit", &window); }后創建的 quit 對象指定了 window 為其父對象。那么關閉程序時,會先調用它的析構函數,然后調用 window 的析構函數。
一個特殊情況
int main() {QPushButton quit("Quit");QWidget window;quit.setParent(&window); }如果反過來,由于 window 后創建,程序關閉時先調用 window 的析構函數(此時 quit 被第一次析構)。接著調用 quit 的析構函數(此時 quit 被第二次析構),這時由于被兩次析構,所以出問題了。
這種特殊情況在編程中很隱蔽,不容易發現。因為編譯的時候不會報錯,只有運行時才會產生問題。所以我們要保持良好的編程習慣以及對事物產生順序有科學的認知。
?
轉載于:https://www.cnblogs.com/bruce1992/p/14253493.html?share_token=988c4e36-f48a-4e00-9c72-4c7d5c5a6684
?
(SAW:Game Over!)
總結
- 上一篇: OS / Linux / 文件描述符以及
- 下一篇: Cpp / 空指针对象调用函数的不同结果