2013-01-15 208 views
0

我可以使用類的前向聲明爲了將它的定義和實現稍後在程序中使用(類似於函數的做法)嗎?類的前向聲明

(我需要將一個程序的多個源文件連接到一個文件中,並且我希望將這些類的定義和實現放在該文件的末尾,以使main位於該文件的頂部。)

+2

你試過了嗎?你有沒有編譯錯誤?編寫一個簡單的例子不用花一分多鐘就可以試試。 – abelenky

+0

或者,您可以將'main'放在底部並忽略問題......無論如何,答案是類的前向聲明的使用有限。 –

+0

@abelenky是的,來自MS VS 1的errCode>錯誤C2079:'student_list'使用未定義的類'Student_list' – MTVS

回答

2

是的,你可以在一定程度上。

你必須認識到,C++編譯器是相當愚蠢的,不會提前閱讀。這就是爲什麼你必須使用函數原型(其他一些原因)。 現在,編譯器解決一個函數並不難。它只是查看函數的返回類型和函數參數的類型,並且只是假設函數在那裏,而不知道函數內部的實際內容,因爲它在那個點上最終並不重要。

但是,類的內容確實很重要(例如,編譯器需要知道類的大小)。但記住關於不讀前面的位?當你轉發定義一個類時,編譯器不知道它裏面的內容,因此缺少大量有關它的信息。需要預留多少空間?

因此,您可以轉發定義類,但不能將它們用作類型。你可以用它做的唯一事情(在它已被具體聲明之前)是指向它的指針(並且用它作爲函數返回類型和模板參數,作爲指針由 @ Cheersandhth.-Alf指出)。

如果您需要使用的東西不是指針,則應該使用標頭(如果您想了解更多信息,請參閱this)。

+0

-1「你可以用它做的唯一事情(在它被具體聲明之前)是使用它的指針「。是不正確的。很難猜測「價值類型」的含義。但「不能將它們用作值類型」的印象就像不能用於按值傳遞的形式參數一樣,也是不正確的。 –

+0

@ Cheersandhth.-Alf在你評論過隊友之前就糾正了它。 – antonijn

+0

所以你有一個指針,你不能直接引用它,直到你定義了類,除了在代理類中使用它有什麼用處? – MTVS

1

沒有一個類定義前面的地方,你不能使用任何類成員,也可以創建任何實例,但你可以

  • 使用T *和T &類型,

  • 使用T代表正式返回類型和參數聲明(是的甚至值),

  • 使用T作爲模板參數,

和可能更多,但以上是我立即想到的。

所以,如果這就是你需要的一切,那麼你就會選擇前進宣言。

然而,所有的前鋒宣佈購買你的草圖情況添加的工作,保持在兩個地相同的代碼,所以很難看到它&hellip點;


哦,我只記得,有一個與前瞻性聲明不完整的類型,即使用delete p其中p是指向不完全類型相關聯的一個特別討厭的未定義行爲。這要求析構函數是微不足道的。如果編譯器是好的,那麼它會發出警告,但不要指望它。


總之,我只想把main這些代碼,它屬於哪裏,避免所有問題的非常年底