2015-11-05 153 views
-1

所以我剛剛閱讀了各種來源的前向聲明(例如谷歌C++風格指南),當我應該和不應該使用前向聲明時,我非常困惑。關於前向聲明的問題(C++)

一方面,如果我總是轉發聲明類,我將永遠不會有循環依賴和更快的編譯時間的麻煩。
但另一方面,我將不得不幾乎完全使用指向對象的指針,這些指針看起來相當不安全,並且考慮到內存泄漏並且也不必複雜。

所以我應該使用前向聲明,只要我可能或只有當它需要避免像循環依賴的東西?

另一個關於前向聲明的問題。如果我正在與GLM(這是一個數學庫)等外部庫一起工作,並且我需要它在許多不同的類中,有沒有辦法提前聲明那些是/它是否有意義呢?什麼,我必須包括(GLM)

例子:

#include <glm.hpp> 
#include <gtc/matrix_transform.hpp> 
#include <gtc/type_ptr.hpp> 

再舉例來說,我會用這樣的:

std::vector <glm::vec3> vertices; 
+1

_「......我將不得不幾乎完全用指針來對象...」_不!引用也適用於前向聲明。 –

回答

1

一般向前聲明最終是必要的只有在有某種循環依賴,通常應該避免。

所以說'只爲循環依賴'的版本更多的是正確的軌道。

「指向對象的指針」與問題無關,因爲在現代C++中,通常原始指針應該避免大部分時間,使用現在標準的智能指針之一,或者更好的引用。根據你想要做什麼,使用Pimpl或快速pimpl習慣用法將班級成員排除在課程標題之外也可能是一種好的做法。

對於問題的最後部分,您可能想要做的是在您自己的單個頭文件中包含通常使用的依賴項外部庫頭,然後將此文件包含在需要的代碼模塊中。如果您已經設置爲使用預編譯頭文件,這也可能會在編譯時間方面帶來優勢。

+0

所以它不值得將每個成員變量改爲(智能)指針,所以我可以轉發聲明,是嗎? –

+1

存儲和生命週期管理,即特定數據元素是分配到堆棧還是堆,以及是否通過引用,指針,智能指針或特定類中的其他手段訪問,通常不應由聲明要求驅動在所有。 在大多數情況下避免前向聲明。 – kert