2011-03-06 63 views
2

我想展示一個簡單的對話是這樣的:如何確定Qt中的對話框是否爲空?

if (!aboutDialog) 
     aboutDialog = new AboutDialog(this); 
    aboutDialog->exec(); 

出於某種原因,這是行不通的(aboutDialog有一些指針雖然未初始化),檢查if (aboutDialog == 0)也不起作用。我不想每次創建實例,但只需要一次。我如何正確檢查?

謝謝!

回答

2

您需要將aboutDialog初始化爲0。可能在該成員屬於的類的構造函數中。

(!aboutDialog)是一個正確的測試。

考慮以下幾點:

#include <iostream> 

class Thing { 
    void *data; 
    public: 
    Thing(){} 
    void print() { 
     std::cout << data << std::endl; 
    } 
}; 

int main() 
{ 
    Thing t; 
    t.print(); 
    return 0; 
} 

嘗試編譯並運行它多次。很可能每次都會打印出不同的內容。爲什麼?因爲data未初始化。它包含垃圾。它具有與0x1234ABCD或42相同的空指針的機會。

要修復它,需要data需要在某處進行初始化。這裏最簡單的方法就是做,在Thing的構造如下圖所示:

Thing() : data(0) {} 
+0

我試過了,但它不起作用。雖然我沒有初始化對象,但只是聲明它不等於零或爲空。 – mimic 2011-03-06 08:46:00

+2

這就是整個觀點。你必須**初始化它。否則,它將包含不太可能等於空指針的垃圾數據。在某些情況下,語言會默認初始化變量,但顯然你不在其中。所以你必須明確地初始化它。順便說一句,打開你的編譯器的警告,它可以經常告訴你,當你做這樣的事情。 – Mat 2011-03-06 08:50:25

+0

我初始化它,但只有在檢查它是否爲null之後。這就像一個單身人士。首先我檢查它是否爲空,如果不是,則初始化它,如果已經初始化,則不執行任何操作。看看我的代碼。我試圖在檢查後初始化它。問題是檢查不起作用。 – mimic 2011-03-06 08:53:25

0

我的答案可能不是最好的:)我使用Qt與蟒蛇,在那裏你(在python)可以寫入新的屬性每當你想「從外面」的課程。如果可能的話,當你構造關於Dialog時,我會設置一個變量(也許不是最佳實踐)。然後你可以檢查這是否在稍後設置。像狀態變量或東西:)

+0

嗯,是的,它可能有效,但首先我想找到一些標準的方式。我只是不明白爲什麼對象不是null,雖然它沒有被初始化,但只聲明。 – mimic 2011-03-06 08:47:25

+1

爲什麼在這個世界中,這比測試'aboutDialog'變量本身更好?我對Python一無所知,所以我不知道你是否必須這樣做,但這聽起來像是一個巨大的混亂。也不可能保持。我不建議*任何人*在C++中這樣做。 – 2011-03-06 09:08:50

+0

@Seacat這就是C++的工作方式:如果你不初始化一個變量,它將有一個隨機值(最可能不是0)。事實上,一個_應該在構造函數中初始化所有**成員變量。如果不是現在,其他任何事情都會給你帶來麻煩,然後幾個月後再次爲你上課。所以只需添加'aboutDialog = 0;'像Mat建議的構造函數,你很好! – Robin 2011-03-11 14:31:40

相關問題