[英]Evading including headers to the .h file
有人告訴我,如果可以回避的話,請勿在.header中包含太多類,而應在.cpp中包含它們。 為此,他們告訴我創建原型類,例如:
class abc;
代替:
include "abc.h"
但這只是在abc類未用作屬性或返回值的情況下。 如果是參數,我可以使用原型...為什么?
另外,為什么在.h文件中包含如此多的標頭如此糟糕?
謝謝
當您向前聲明課程時:
class abc;
是成為不完整類型 ,並且您只能對不完整類型做某些事情。 例如,任何需要了解班級成員,甚至需要了解班級規模的知識,都需要完整的聲明。
至於包括其他標頭中的標頭,我可以想到以下兩個參數:
根據項目的大小,編譯器,硬件等的不同,第一個可能相關,也可能不相關。第二個也有問題,因為它並沒有真正減少類之間的依賴關系。
必須使用前向聲明的一種情況是,在不同標頭中定義的兩個類之間具有循環依賴關系。
如果是參數,我可以使用原型...為什么?
每當不需要訪問已聲明類的內部結構時,例如在聲明指針,引用或將其作為參數傳遞時,都可以使用前向聲明。 您不能使用前向聲明來繼承類,調用其任何成員函數或訪問其成員或聲明非指針/引用類型的成員:這是因為編譯器必須知道該類的內部結構才能執行以上任何操作。
為什么在.h文件中包含這么多標頭如此糟糕?
這本身並不普遍“不好”,但是對於許多編譯器而言,這可能會減慢編譯過程,因此通常將包含的內容減至最少。 現代編譯器具有有用的功能(例如預編譯的標頭)以最大程度地減少影響,因此使用前向聲明可以使您在實際操作中比實際問題更具美感。
class abc;
當您向前聲明一個類型時,編譯器會將其視為Incomeplete類型,並且它不具有有關該類型的內存布局/組成的任何信息。 因此,您不能要求編譯器執行任何需要其了解此信息的操作。
使用不完整類型,您不能:
但是使用不完整類型,您可以:
為什么在.h文件中包含這么多標頭如此糟糕?
不好是因為:
包括許多標頭很不好,因為如果您更改其中的一個標頭,那么您也必須編譯文件,這聽起來似乎不是問題,但是對於大型程序,編譯+鏈接可能會花費很多時間(有時數小時)
在需要生成代碼之前,編譯器只需要知道名稱(而不是組成部分)即可。
因此,前進聲明是必經之路-因為它不需要加載和解析。
順便說一句-它有助於使makefile不必開始重新編譯內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.