2013-08-20 60 views
0

我知道它被認爲是過時/過時的風格,以便在不需要的地方過度使用指針。但是,我發現這種理想的衝突與避免編譯器依賴關係的另一考慮。C++:避免​​編譯器依賴與避免指針過度使用

具體來說,我可以在頭文件中使用前向聲明,並避免#include語句,如果成員變量是指針。但是,這導致我將自己的類的成員變量作爲指針,即使沒有真正的理由這樣做。順便說一句,我發現使用Qt框架(我喜歡)使我用這種java-esque一攬子編程風格進行編程,因爲這是接口的設置方式。

我該如何衡量這兩個相互競爭的考慮因素?

+0

你測量過性能嗎?堆分配是一個瓶頸嗎?如果是這樣,你可以只改變熱點 – TemplateRex

+1

不要過度去做。第一個目標是一個好的設計,然後是實現。編譯器依賴關係只是實現的一個細節。不要爲了改善編譯時間而打破你的設計,最可能根本就不重要(對於中小型項目) –

+0

我只會使用不在標題中的東西的前向decl,但可以將其限制(作爲實現細節)到實現源文件的匿名名稱空間。使用前向decl(而不是包含適當的頭文件)也只能產生錯誤和混淆:不要這樣做。 – Walter

回答

0

這取決於。減少依賴關係本身就是一件好事,但它必須與所有其他問題進行權衡。例如,使用編譯防火牆語言,可以將 依賴關係移出頭文件,代價爲分配一個 。

至於什麼QT的作用:它是一個GUI框架,它(通常是---我 沒有看QT)意味着大量的多態性,而且大多數 類是有身份的,不能被複制。在這種情況下,您通常不得不使用動態分配並使用指針 。避免指針的規則主要涉及具有值語義的對象 。

(順便說一下,沒有什麼「老式」或 「外的日期」關於使用太多的指針。它已經統治 ,因爲我在25年前開始使用C++。)

+1

注意:PIMPL的無執行實現通過在類'pimpl '中保留空間(正確對齊)來工作。在'pimpl'的構造函數中添加一個'static_assert'來確保它足夠大,然後在這裏。 –

0

Qt需要它,因爲它是一個可以動態加載的庫。用戶可以編譯和鏈接,而不必擔心實現細節。您可以在運行時使用許多版本的Qt,而無需重新編譯。這非常強大和靈活。如果在類內部使用私有對象實例,這是不可能的。