2012-04-13 67 views
4

可能重複:
What is forward declaration in c++?頭文件中的空類聲明?

我只是有一個什麼一段代碼在這個簡單的例子是幹什麼的問題。我查了好友類並瞭解它們是如何工作的,但我不明白頂層的類聲明實際上在做什麼(即機器人)。這是否意味着Happy類可以使用Robot對象,但他們無法訪問其私有部分,任何信息將不勝感激。

#include <stdlib.h> 
#include <stdexcept> 

template <typename T> // What is this called when included 
class Robot;   // is there a special name for defining a class in this way 

template <typename T> 
class Happy 
{ 
    friend class Joe<T>; 
    friend class Robot<Happy<T> >; 
    // ... 
}; 
+0

http://stackoverflow.com/questions/4926105/what-is-forward-declaration-in-c – mydogisbox 2012-04-13 21:36:36

回答

4

這是一個正向聲明

它只是在那裏通知編譯器名爲Robot的類模板將在稍後定義,並且它應該期望該定義。

與此同時(即,直到Robot被正式定義),它允許程序員在代碼中引用該類型。在你給出的例子中,有必要聲明RobotHappy類的friend。 (誰挑這些名字?!)

這是避免循環依賴和最小化編譯時間/開銷的常用策略。

+0

+1,常用的術語是*前置聲明*,即使正式術語只是*聲明* 。通常會添加* forward *以使其明確表示我們只處理聲明而不處理* definition *(這也是*聲明*) – 2012-04-13 22:01:11

+0

我選擇了名稱haha – Ockham 2012-04-14 00:23:31

+0

我正在開發一個項目,類'B'頭文件中類「A」的前向聲明。我注意到我可以評論前向聲明,而是導入類「A」的頭文件,並且似乎工作相同。 是否有使用其中一個的理由? – Gonzalo 2015-08-09 19:03:12

0

它基本上對代碼的其餘部分說「你可以使用這個,但我稍後會聲明它」。 如果沒有這一行,這段代碼不會編譯: friend class Robot<Happy<T> >;

0

這就是所謂的正向聲明 - 它基本上是說給編譯器; 「相信我,我會用一個我將在後面定義的課程」。但是因爲編譯器不知道機器人成員的任何信息,所以只能在其中只有一個指針(或引用)的地方使用它。

這是因爲否則您需要在此標頭中包含機器人標題,這可能會導致其他循環依賴。

0

這就是所謂的「前向聲明」。你正在告訴編譯器「有一個類叫做Robot。我沒有解釋它的外觀,但要知道它存在」。這樣,編譯器在看到您在Happy的定義內使用Robot時不會拋出「未定義的標識符」錯誤。不過,您仍然必須在某個地方包含Robot的完整定義,否則最終會出現鏈接器錯誤。

當一個對象需要引用在.h文件中更下面定義的內容時,或者當兩個對象需要相互引用時,您通常會看到這種情況。