2014-01-10 31 views
2

我目前有一個從QMainWindow派生的名爲`foo'的Qt窗體類。如何知道Qt表單是否有效

現在在其它的類我有這樣的事情

class someclass 
{ 
    private: 
     foo* form; 
    ...... 
    public: 
     someclass() 
     { 
      form = NULL; 
     }  
}; 

現在有在SomeClass的一個方法,它需要知道FOO *是有效的,如果它指向 一個有效的FOO形式。我想知道實現這個目標的最佳方式是什麼。我應該去

if(form!=NULL) {...} 

問題是,上述方法不保證一個可靠的有效形式。有什麼建議麼 ?

+0

@Charles:請不要刪除任何與主題密切相關的標籤。你不僅不必要地碰到問題,而且還會從與其相關的類別中刪除Q/A。 – lpapp

+0

@Laszlo,我正準備用大量的Meta鏈接來表達你的興趣,這些鏈接表明你不應該將庫標籤添加到標籤只適用於答案的問題上,但我顯然完全誤解了以前的社區共識。對於我的正義標籤燃燒造成的不便,我表示歉意。 – Charles

+0

@Charles:不用擔心。 – lpapp

回答

1

我認爲你正在尋找智能指針。通常,這個檢查是由一個弱指針完成的。這不會保留對象的所有權,但它可以檢查isNull() method的有效性。

Qt爲此建立了一個便利的類,名爲QWeakPointer。它通常與共享指針配對使用,在Qt世界中這將是QSharedPointer

的QWeakPointer類包含一個弱引用共享指針

的QWeakPointer是自動弱引用C++中的指針。它不能用於直接取消引用指針,但可用於驗證指針是否已在另一個上下文中被刪除。

QWeakPointer對象只能通過從QSharedPointer分配來創建。

這裏有你可以實際使用的方法來查看擁有該對象的主QSharedPointer是否刪除了引用的指針。

布爾QWeakPointer :: ISNULL()const的

,則返回true,如果該對象被保持爲空指針的引用。

請注意,由於弱引用的性質,QWeakPointer引用的指針在任何時刻都可能爲空,所以從此函數返回的值可以從一個調用改變爲下一個,從false更改爲true。

這樣,其他類不需要獲得對擁有所有權的指針的引用,但根據具體的用例,您可以隨處使用QSharedPointer。

+1

當傳遞一個父對象時(您應該始終對對話執行操作,不會中斷窗口堆棧),共享對象與QObject不能很好地協作,因爲父對象和sharedptr都擁有所有權,並且在父對象的情況下sharedptr將導致雙重刪除首先刪除。因此,我會小心處理諸如「你可以在任何地方都可以使用QSharedPointer」等語句。 –

+0

@FrankOsterfeld:嗯,看起來這個句子中「Everywhere」的含義並不適合你。 :)它試圖引用每個地方,例如:具有共享指針成員的類以及任何可以訪問該代碼的外部代碼。這個詞並不是指「每個場景」。 Fwiw,我甚至寫過「取決於你的用例」,這意味着在每種情況下都不是。如果您認爲可以更清楚地提出建議編輯,可以隨意提出建議,但我認爲,除非有其他問題,否則我的意圖仍然是正確的。 – lpapp

+0

至於父母/孩子之間的關係,如果您希望確保指針是有效的,我不確定這是最終和最終的正確方法。我個人認爲,信息與OP的意圖無關。也許,OP只是試圖提供儘可能多的信息,但無論如何,我個人並沒有看到無父母的主窗口的最終問題。如果是這樣,API可能會禁止它。 :) – lpapp

1

根據foo類的範圍而不是foo *使用QScopedPointer或QSharedPointer。這將允許可靠地檢查指針是否有效,比較指向null的指針將無助於檢測指向野外的已刪除指針。

相關問題