2012-04-11 48 views
4

我想知道是否必須在使用該類作爲朋友的類中包含「Class1.h」。例如,授予對Class1類的權限的類的.h文件。在朋友的課堂中包含頭文件

class Class2 { 
    friend class Class1; 
} 

你需要#include「Class1.h」還是沒有必要?同樣在Class2類中,從不創建或使用Class1對象。 Class1從來沒有反過來操縱Class2。

回答

8

的語法是:

friend class Class1; 

不,你不包括頭。更一般地說,除非實際上以某種方式使用類定義(例如,使用類的實例並且編譯器需要知道其中的內容),否則不需要包含頭。如果您只是按名稱引用課程,例如你只需要一個指向類的實例的指針,然後編譯器不需要看類定義 - 只要聲明它就可以告訴它類:

class Class1; 

這很重要,原因有兩個:小的一點是它允許你定義相互引用的類型(但你不應該!);最主要的是它允許你減少代碼庫中的物理耦合,這可以幫助減少編譯時間。


要回答Gary的評論,可觀察到該編譯和鏈接罰款:

class X; 

class Y 
{ 
    X *x; 
}; 

int main() 
{ 
    Y y; 
    return 0; 
} 

無需提供X的定義除非你實際使用的東西,從十

+0

我的壞。我沒有寫在實際的代碼中,雖然 – JDN 2012-04-11 20:27:08

+2

在發佈到SO之前總是編譯你的代碼:) – 2012-04-11 20:27:55

+0

只要類最終包含在同一個二進制文件中(否則在鏈接過程中會出錯) – 2012-04-11 20:33:08