C 前置宣告

2021-09-07 10:15:18 字數 1986 閱讀 7303

一般的前置函式宣告

見過最多的前置函式宣告,基本格式**如下:

1 #include 2

using

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改為指標,因為對於特定的平台指標大小事固定的。如下是編譯四個階段的過錯。其中編譯階段不會...