2011-02-08 81 views
5

我一直在尋找的恐懼SDK爲我的大學項目,但已經注意到像這樣一些代碼:爲什麼包含一個頭和前向聲明包含在同一個cpp文件中的類?

foo.h中

class Foo 
{ 
    public: 
     int iSomething; 
}; 

Bar.cpp:

#include "Foo.h" 

// Forward declarations 
class Foo; 

是有任何特別的理由來轉發申報和包括相應的頭文件在同一個cpp文件?或者是因爲包含標題而導致前向聲明是多餘的?

編輯:

每次我都在代碼中看到它的時候,包含語句總是向前聲明之前。

回答

6

它不僅僅是多餘的,它可能有問題。說Foo.h發生了變化,所以Foo變成了一種泛型模板化等價物的特定實例化的類型定義 - 這是可以作爲正常軟件進化的一部分而預料到的東西。然後Bar.cpp的「X類」會引起不必要的編譯錯誤ALA:

--- fwd.h --- 
template <typename T> 
class XT 
{ 
    public: 
    int n_; 
}; 

typedef XT<int> X; 

--- fwd.cc --- 
#include "fwd.h" 

class X; 

int main() 
{ 
    X x; 
    x.n_ = 0; 
    return x.n_; 
} 

--- compilation attempt --- 
~/dev .../gcc/4.1.1/exec/bin/g++ fwd.cc -o fwd 
fwd.cc:3: error: using typedef-name 'X' after 'class' 
fwd.h:8: error: 'X' has a previous declaration here 

這是一個原因,我總是建議使用專用的前瞻性聲明報頭翼<iosfwd>,並且維護幷包括由主標題,以確保持續一致性。我從來沒有放過「X班」在實現文件中,除非在那裏定義類。請記住,「X類」的看似好處;「前向聲明沒有太多,以至於他們避免了#include,更多的是他們包含的文件可能很大,並且包含很多其他文件:專用的前向聲明頭文件通常會避免絕大多數文件。

1

前向聲明是多餘的,但也是非常無害的。也許作者使用了很多前向聲明,並沒有嚴格確保它們總是被要求。

3

如果前向聲明來自includes之前,它可能會消除依賴關係。在定義它的實際.h文件之後,它什麼都不做。

+0

你能詳細說明一下嗎?我原本寫了這個完全相同的東西,但後來我想了一些更多的關於它,並認爲如果酒吧前鋒 - 宣佈美孚,然後立即#includes Foo.h,它應該a)始終導致Foo的宣言,無論如何,和b)從不依賴於已經聲明Foo的另一個頭。你可以舉一個例子,說明在#include之前進行前向聲明實際上有幫助嗎? – mgiuca 2011-02-08 02:04:01

2

原始class Foo;可能已經退化。請記住,如果源僅使用指向Foo類的指針[並且實際上並未嘗試創建Foo對象或取消引用Foo指針],則在使用它之前不需要定義該類。

在沒有看到代碼,我斗膽猜測是bar.cpp的原始版本有這樣並不需要富

I的定義中使用的前置聲明中大型項目,以減少編譯時間碼。編譯時間不是一個問題,當它需要一秒鐘,但項目需要一小時建立每秒幫助:)

相關問題