我有一個B類,我想打電話給成員形成類A.所以:包含在頭文件與前瞻性聲明,包括在的.cpp
1.
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
2。
// A.h
#include "B.h"
class A
{
private:
B * impl_;
};
哪種方式比較好,這兩種類似,當一個小項目不依賴太多的涉及?
我有一個B類,我想打電話給成員形成類A.所以:包含在頭文件與前瞻性聲明,包括在的.cpp
1.
//A.h
class B;
class A
{
private:
B* m_p;
};
//a.cpp
#include "B.h"
2。
// A.h
#include "B.h"
class A
{
private:
B * impl_;
};
哪種方式比較好,這兩種類似,當一個小項目不依賴太多的涉及?
做的你的第一個方式是指在a.h
,該存在class B
是已知的,但不是它的定義。這限制了B
在a.h
內可以做什麼。例如,可以使用B *
類型的變量,但不能使用B
類型的變量(因爲要聲明B
類型的變量,編譯器必須能夠看到B
的完整定義)。另外,如果您有B *
類型的變量,則不能取消引用指針(因爲也必須知道B
的定義)。
因此,您的第二個選擇–哪些沒有這些問題–是首選,這是大多數人使用大多數時間。
這只是第一種方法可能有用的特殊情況。例如:
.h
文件包括彼此(但你可能會得到一些更多的問題,也包括有關的得分後衛,這是很難的,並且要避免的);b.h
非常大且複雜,所以您希望儘可能避免包含它,因爲它會減慢編譯過程。只是聲明類中的A類的標題。
class B;
第二個比較好。它使B
類成爲您使用.h
文件包含的模塊。考慮將來子集B
的情況,並且您將A
更新爲使用C
。在第二種情況下,您只能替換標頭#include
和A
的化妝品。在第一種情況下,您必須更改前向聲明。另外,在第二種情況下,您定義的不僅僅是符號B
。
而且作爲註釋,你應該使用#include "B.h"
如果頭文件在同一目錄作爲代碼的其餘部分。
那麼你正在做的是叫做向前decleration什麼,你想,其原因是,如果你有這樣的事情類A使用類B以及B類使用A級
在的情況下只有一種關係,你當然可以使用你的第二選擇。 如果您需要雙重用法,那麼至少有一個類的刪除將不得不使用正向刪除
答案:。
看看http://www.umich.edu/~eecs381/handouts/handouts.html
C Header File Guidelines
C++ Header File Guidelines(由大衛Kieras,EECS系,美國密歇根大學)說:
指引#10。 如果X類型的不完整聲明將執行,則使用 而不是#包含其頭X.h。如果另一個結構或類 X型只出現在中 內容的標題連接文件,那麼你不應該#包括XH,只是把X的 不完整的申報指針或引用類型(也稱爲「正向」的聲明)附近 頭連接文件的開頭,如:
class X;
見講義 Incomplete Declarations這個強大而 有價值的技術的更多討論。請注意,標準庫包含不完整的聲明,往往蘇夫網絡CES的<iostream>
圖書館,名爲<iosfwd>
的頭 。 #include<iosfwd>
只要有可能,因爲 頭文件的文件非常大(巨模板!)。
你的第一種方法是向前聲明。你的第二個實際上包括類B.
什麼時候使用一個?
確實喜歡:'#include「B.h」' – 2013-04-05 07:13:17
啊,我會小心的...... – colddie 2013-04-06 06:49:33