我想展示一個簡單的對話是這樣的:如何確定Qt中的對話框是否爲空?
if (!aboutDialog)
aboutDialog = new AboutDialog(this);
aboutDialog->exec();
出於某種原因,這是行不通的(aboutDialog有一些指針雖然未初始化),檢查if (aboutDialog == 0)
也不起作用。我不想每次創建實例,但只需要一次。我如何正確檢查?
謝謝!
我想展示一個簡單的對話是這樣的:如何確定Qt中的對話框是否爲空?
if (!aboutDialog)
aboutDialog = new AboutDialog(this);
aboutDialog->exec();
出於某種原因,這是行不通的(aboutDialog有一些指針雖然未初始化),檢查if (aboutDialog == 0)
也不起作用。我不想每次創建實例,但只需要一次。我如何正確檢查?
謝謝!
您需要將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) {}
我的答案可能不是最好的:)我使用Qt與蟒蛇,在那裏你(在python)可以寫入新的屬性每當你想「從外面」的課程。如果可能的話,當你構造關於Dialog時,我會設置一個變量(也許不是最佳實踐)。然後你可以檢查這是否在稍後設置。像狀態變量或東西:)
嗯,是的,它可能有效,但首先我想找到一些標準的方式。我只是不明白爲什麼對象不是null,雖然它沒有被初始化,但只聲明。 – mimic 2011-03-06 08:47:25
爲什麼在這個世界中,這比測試'aboutDialog'變量本身更好?我對Python一無所知,所以我不知道你是否必須這樣做,但這聽起來像是一個巨大的混亂。也不可能保持。我不建議*任何人*在C++中這樣做。 – 2011-03-06 09:08:50
@Seacat這就是C++的工作方式:如果你不初始化一個變量,它將有一個隨機值(最可能不是0)。事實上,一個_應該在構造函數中初始化所有**成員變量。如果不是現在,其他任何事情都會給你帶來麻煩,然後幾個月後再次爲你上課。所以只需添加'aboutDialog = 0;'像Mat建議的構造函數,你很好! – Robin 2011-03-11 14:31:40
我試過了,但它不起作用。雖然我沒有初始化對象,但只是聲明它不等於零或爲空。 – mimic 2011-03-06 08:46:00
這就是整個觀點。你必須**初始化它。否則,它將包含不太可能等於空指針的垃圾數據。在某些情況下,語言會默認初始化變量,但顯然你不在其中。所以你必須明確地初始化它。順便說一句,打開你的編譯器的警告,它可以經常告訴你,當你做這樣的事情。 – Mat 2011-03-06 08:50:25
我初始化它,但只有在檢查它是否爲null之後。這就像一個單身人士。首先我檢查它是否爲空,如果不是,則初始化它,如果已經初始化,則不執行任何操作。看看我的代碼。我試圖在檢查後初始化它。問題是檢查不起作用。 – mimic 2011-03-06 08:53:25