兩個類相互包含引用的問題

2021-06-23 03:59:02 字數 1180 閱讀 3264

1、背景

程式設計中遇到如下錯誤:使用不完全型別**以及**前向宣告。

查詢相關資料後發現是類的前向宣告(forward declaration)

問題:在程式中宣告乙個類後,此類是乙個不完全型別(

incompete type),即已知此類是乙個型別,但不知道包含哪些成員。

不完全型別

只能以有限方式使用,不能定義該型別的物件。不完全型別只能用於定義指向該型別的指標及引用,或者用於宣告(而不是定義)使用該型別作為形參型別或返回型別的函式。

2、為什麼需要前向宣告

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如:定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別

class a

class b

請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子:

class a

class b

在這種情況下,想想能夠有a.b.a.b.a.b.a.b.a.b…………,很有點子子孫孫無窮盡之狀,那麼我的機器也無法承受。最主要的還是這種關係很難存在,也很難管理。這種定義方式類同程式中的死迴圈。所以,一般來說,兩者的定義,至少有一方是使用指標,或兩者都使用指標,但是決不能兩者都定義實體物件。

言歸正傳,那麼,在定義時因為相互引用肯定會需要相互包含頭文件,假如僅僅只是在各自的頭文件中包含對方的頭文件,是通不過編譯的,如下:

//class a.h

#include "b.h"

class a

//class b.h

#include "a.h"

class b

3、問題解決辦法

一般的做法是:兩個類的頭文件之中,選乙個包含另乙個類的頭文件,但另乙個頭文件中只能採用class *;的申明形式,而在實現文件中(*.cpp)中包含頭文件,如下:

//class a.h

#include "b.h"

class a

//class b.h

class a;

class b

//在b.cpp中的文件包含處要有下面語句,否則不能呼叫成員a的任何內容

#include "a.h"

b::b()

**:

兩個類相互包含引用的問題

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如 定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別 class a class b 請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子 class a class b 在這種情況下,想想能夠...

c 兩個類相互包含引用的問題

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如 定義了類a類b,a中使用了b定義的型別,b中也使用了a定義的型別 class a class b 請注意上面的定義內容,一般情況下是不能出現類a,類b相互引用都定義物件,即如下的樣子 class a class b 在這種情況下,想想可以...

C 兩個類相互包含引用的問題

class a class b class a class b class a.h include b.h class a class b.h include a.h class b 怎麼辦?一般的做法是 兩個類的標頭檔案之中,選乙個包含另乙個類的標頭檔案,但另乙個標頭檔案中只能採用class 的申...