一般的前置函式宣告
見過最多的前置函式宣告,基本格式**如下:
1 #include 2using
namespace
std;34
void fun(char ch, int *pvalue, double
dvalue);56
void
main()714
15void fun(char ch, int *pvalue, double
dvalue)
16
很好理解,不做贅述。
自定義型別的前置宣告
自定義型別的前置宣告,由於編譯器不知道型別的大小,所以不可以宣告型別的物件。只可以利用型別宣告指標和引用。
**如下:
1/*2* 自定義型別前置宣告3*/
4 #include 5
using
namespace
std;67
classb;8
9class
a 10
31 ~a()
3235
36void
funa()
3740
};41
42classb43
52 ~b()
5356
void
doanything()
5760
};61
62void
main()
63
如上,利用前置型別的指標想呼叫其成員函式,會報編譯錯誤!那麼,腫麼辦?請看下文。
宣告和實現分離
**如下,宣告標頭檔案:
1/*2* testforwarddeclar.h3*/
4#ifndef d_testforwarddeclar_h_
5#define d_testforwarddeclar_h_
67 #include 8
9class b; //
前置宣告自定義型別
1011
class
a 12;29
30classb31
;4041#endif
**如下,定義檔案:
1/*2* testforwarddeclar.cpp3*/
45 #include "
testforwarddeclar.h
"6 #include 7
8 a::a (b *pbpara)
9 : m_nint(100)10
, m_nrint(m_nint)
11, m_pint(null)
12, m_pb(null)
13 , m_b((null == pbpara) ? (*m_pb) : (*pbpara))
1417
18 a::~a()
1922
23void
a::funa()
2427
2829 b::b (int
n) : m_n(n)
3033
34 b::~b()
3538
39void
b::doanything()
40
**如下:測試檔案:
1 #include "testforwarddeclar.h"2
3void
main()
4
編譯成功,執行結果是期望效果。
總結自定義型別前置宣告時,只可以利用型別名宣告指標和引用變數(謹記不可以宣告物件或new 物件,均因為型別大小不確定,編譯器無能為力)。
若需要利用指標或引用呼叫前置型別的介面,必須按照宣告和實現分離的方式進行編碼。
good good study, day day up.
順序 選擇 迴圈 總結
C 前置宣告
特點 被宣告的類不用重新編譯,節省編譯時間 比如a包含乙個指向b的指標,b包含a的乙個例項,這種情況下,使用前置宣告。易錯的點 class date class task1 因為分配器為d分配記憶體的時候,必須要知道 d的大小 主要應用場景是兩個標頭檔案相互包含的場景,建議僅將前置宣告用於解決迴圈引...
C 前置宣告
問題 最近遇到了兩個類a b相互呼叫的情況,於是想當然的在兩個類a和b的標頭檔案中 include 了所需的標頭檔案,當然結果編譯報錯了。為什麼呢,a需要b,b需要a,形成了迴圈,違反了程式的確定性原則。如下圖所示 如這樣相互包含的問題,可以使用前置宣告來解決。即 在標頭檔案中宣告該類,在實現檔案中...
C 編譯,前置宣告
class a class b 存在類巢狀的問題,編譯無法通過。採用前置宣告解決 class b class a class b 以上 還是錯誤的,因為在編譯期間對於類的定義需要知道其成員變數型別的大小。將a.b改為指標,因為對於特定的平台指標大小事固定的。如下是編譯四個階段的過錯。其中編譯階段不會...