正在看google c++編程規范,里面對頭文件依賴是這么說的:
使用前置聲明(forward declarations)盡量減少.h文件中#include的數量。 當一個頭文件被包含的同時也引入了一項新的依賴(dependency),只要該頭文件被修改,代碼就要重新編譯。如果你的頭文件包含了其他頭文件,這些頭文件的任何改變也將導致那些包含了你的頭文件的代碼重新編譯。因此,我們寧可盡量少包含頭文件,尤其是那些包含在其他頭文件中的。 使用前置聲明可以顯著減少需要包含的頭文件數量。舉例說明:頭文件中用到類File,但不需要訪問File的聲明,則頭文件中只需前置聲明class File;無需#include "file/base/file.h"。 在頭文件如何做到使用類Foo而無需訪問類的定義? 1) 將數據成員類型聲明為Foo *或Foo &; 2) 參數、返回值類型為Foo的函數只是聲明(但不定義實現); 3) 靜態數據成員的類型可以被聲明為Foo,因為靜態數據成員的定義在類定義之外。 另一方面,如果你的類是Foo的子類,或者含有類型為Foo的非靜態數據成員,則必須為之包含頭文件。 有時,使用指針成員(pointer members,如果是scoped_ptr更好)替代對象成員(object members)的確更有意義。然而,這樣的做法會降低代碼可讀性及執行效率。如果僅僅為了少包含頭文件,還是不要這樣替代的好。 當然,.cc文件無論如何都需要所使用類的定義部分,自然也就會包含若干頭文件。 譯者注:能依賴聲明的就不要依賴定義。
於是在VC下做了下測試,先自行建立Foo.h,Foo.cpp文件,里面定義一個類CFoo,不用管怎么定義,隨便都行,然后建議main.cpp,在里面測試:
class CFoo;
class test
{
public:
/*1*/ CFoo func(CFoo foo);//ok
/*2*/ static CFoo sub;//ok
/*3*/ CFoo& foo1;//ok
/*4*/ CFoo* pfoo1;//ok
/*5*/ CFoo foo; //error
};
之前都是直接include Foo.h 文件,這次不引用,而是聲明一下CFoo類。下面看test類的聲明。
1、正確。說明了規范中第2點,函數參數和返回值只是聲明。
2、正確。說明了規范中第3點,靜態數據成員的類型可以被聲明為Foo,因為靜態數據成員的定義在類定義之外。
3、4、正確。5錯誤。說明了規范中第1點,非靜態的數據成員必須是指針或引用,否則需要依賴定義,其實也好理解,非靜態表示每個實例都占有內存,必然需要知道內存的大小,沒有定義怎么能知道呢?
