2013-03-21 122 views
1

我已被告知不包括在.header太多的課,如果我能迴避它,而是,包括它們在.cpp。要做到這一點,他們告訴我創建原型類,如:偷稅包括標題到.h文件

class abc; 

代替:

include "abc.h" 

但這只是萬一ABC類不被用作屬性或返回值。如果它是一個參數,我可以使用原型...這是爲什麼?

另外,爲什麼是如此糟糕,包括在.h文件中這麼多的頭?

感謝

回答

2

如果它是一個參數,我可以使用的原型......這是爲什麼呢?

只要喲不需要訪問已聲明類的內部結構,您就可以使用前向聲明,例如,當你聲明一個指針,一個引用或者將它作爲參數傳遞時。您不能使用前向聲明來繼承類,調用其任何成員函數或訪問其成員,或者聲明非指針/引用類型的成員:這是因爲類的內部結構必須爲編譯器所知做任何以上。

爲什麼這麼差,包括在.h文件中這麼多的頭?

這本身並不是普遍的「壞」,但是對於許多編譯器來說,它可能會減慢編譯過程,所以通常最小化包含。現代編譯器具有有用的功能(如預編譯頭文件)以最大限度地減少影響,因此使用前向聲明可以使您變得更加美觀而不是實際問題。

+0

預編譯頭做幫助,但不解決的,需要的代碼庫的主要部分,如果其中一個標題被修改不必要地重新編譯大型依存關係樹的問題。使用預編譯頭文件只需加快重建速度,但不會阻止它。 – 2013-03-21 11:49:30

+0

好吧,但是,如果原型類被用作屬性,我不能使用原型,我必須做include,或者至少是我被告知的。爲什麼? – Frion3L 2013-03-21 12:07:38

+0

@ Frion3L如果使用前向聲明的'class Foo'作爲屬性,則有三個選項:使其成爲指針'Foo * attr',引用'Foo&attr'或值'Foo attr'。這只是第三種情況,因爲編譯器需要知道'Foo'的結構,以便計算其中'Foo attr'是屬性的類的大小。 – dasblinkenlight 2013-03-21 13:40:42

2

當你向前聲明一個類:

class abc; 

是成爲incomplete type,而且也只有某些東西,你可以用一個不完整的類型做。例如,任何需要了解班級成員的知識,甚至是對其規模的瞭解,都需要一個完整的聲明。

至於包括來自其他頭頭,我能想到的對兩個參數:

  1. 改進生成時間。
  2. 更少的依賴性。

第一種可能或不可能根據項目的大小有關,你的編譯器,硬件等。第二個也值得懷疑,因爲它並沒有真正減少類之間的依賴關係。

使用前向聲明時的一種情況是,當您在不同標頭中定義的兩個類之間存在循環依賴關係時。

1
class abc; 

當向前聲明一個類型的編譯器將其視爲Incomeplete型和它不具有有關此類型的存儲器佈局/組合物的任何信息。所以你不能要求編譯器執行任何要求它知道這些信息的操作。

一種不完全類型不能:

  • 用它來聲明一個成員。
  • 定義使用此類型的函數或方法。

但不完整的類型,您可以:

  • 聲明一個成員是一個指向不完全類型。
  • 聲明接受/返回不完整類型的函數或方法。
  • 定義接受/返回指向不完整類型的指針(但不使用其成員)的函數或方法。

爲什麼這麼差,包括在.h文件中這麼多的頭?

這是不好的,因爲:

  • 包括頭僅僅是標題的內容複製粘貼到當前翻譯單元。這增加了編譯時間以及構建依賴關係。
0

這是不好的,包括許多頭,因爲如果你改變了其中的一個,你必須編譯文件爲好,這聽起來或許不是一個問題,但對於大型程序編譯+鏈接會花費大量的時間(有時小時)

0

所有編譯器在需要生成代碼之前需要知道的是名稱而不是組合。

所以前置聲明是要走的路 - 因爲它不需要加載和解析。

順便說一句 - 它有助於生成文件沒有啓動重新編譯的東西。