我已被告知不包括在.header太多的課,如果我能迴避它,而是,包括它們在.cpp。要做到這一點,他們告訴我創建原型類,如:偷稅包括標題到.h文件
class abc;
代替:
include "abc.h"
但這只是萬一ABC類不被用作屬性或返回值。如果它是一個參數,我可以使用原型...這是爲什麼?
另外,爲什麼是如此糟糕,包括在.h文件中這麼多的頭?
感謝
我已被告知不包括在.header太多的課,如果我能迴避它,而是,包括它們在.cpp。要做到這一點,他們告訴我創建原型類,如:偷稅包括標題到.h文件
class abc;
代替:
include "abc.h"
但這只是萬一ABC類不被用作屬性或返回值。如果它是一個參數,我可以使用原型...這是爲什麼?
另外,爲什麼是如此糟糕,包括在.h文件中這麼多的頭?
感謝
如果它是一個參數,我可以使用的原型......這是爲什麼呢?
只要喲不需要訪問已聲明類的內部結構,您就可以使用前向聲明,例如,當你聲明一個指針,一個引用或者將它作爲參數傳遞時。您不能使用前向聲明來繼承類,調用其任何成員函數或訪問其成員,或者聲明非指針/引用類型的成員:這是因爲類的內部結構必須爲編譯器所知做任何以上。
爲什麼這麼差,包括在.h文件中這麼多的頭?
這本身並不是普遍的「壞」,但是對於許多編譯器來說,它可能會減慢編譯過程,所以通常最小化包含。現代編譯器具有有用的功能(如預編譯頭文件)以最大限度地減少影響,因此使用前向聲明可以使您變得更加美觀而不是實際問題。
當你向前聲明一個類:
class abc;
是成爲incomplete type,而且也只有某些東西,你可以用一個不完整的類型做。例如,任何需要了解班級成員的知識,甚至是對其規模的瞭解,都需要一個完整的聲明。
至於包括來自其他頭頭,我能想到的對兩個參數:
第一種可能或不可能根據項目的大小有關,你的編譯器,硬件等。第二個也值得懷疑,因爲它並沒有真正減少類之間的依賴關係。
使用前向聲明時的一種情況是,當您在不同標頭中定義的兩個類之間存在循環依賴關係時。
class abc;
當向前聲明一個類型的編譯器將其視爲Incomeplete型和它不具有有關此類型的存儲器佈局/組合物的任何信息。所以你不能要求編譯器執行任何要求它知道這些信息的操作。
一種不完全類型不能:
但不完整的類型,您可以:
爲什麼這麼差,包括在.h文件中這麼多的頭?
這是不好的,因爲:
這是不好的,包括許多頭,因爲如果你改變了其中的一個,你必須編譯文件爲好,這聽起來或許不是一個問題,但對於大型程序編譯+鏈接會花費大量的時間(有時小時)
所有編譯器在需要生成代碼之前需要知道的是名稱而不是組合。
所以前置聲明是要走的路 - 因爲它不需要加載和解析。
順便說一句 - 它有助於生成文件沒有啓動重新編譯的東西。
預編譯頭做幫助,但不解決的,需要的代碼庫的主要部分,如果其中一個標題被修改不必要地重新編譯大型依存關係樹的問題。使用預編譯頭文件只需加快重建速度,但不會阻止它。 – 2013-03-21 11:49:30
好吧,但是,如果原型類被用作屬性,我不能使用原型,我必須做include,或者至少是我被告知的。爲什麼? – Frion3L 2013-03-21 12:07:38
@ Frion3L如果使用前向聲明的'class Foo'作爲屬性,則有三個選項:使其成爲指針'Foo * attr',引用'Foo&attr'或值'Foo attr'。這只是第三種情況,因爲編譯器需要知道'Foo'的結構,以便計算其中'Foo attr'是屬性的類的大小。 – dasblinkenlight 2013-03-21 13:40:42