C 兩個類相互引用的問題

2021-07-10 02:49:01 字數 1798 閱讀 1109

c++中常會出現兩個類相互引用的問題,如果直接相互引用對方的標頭檔案,編譯時會報錯,下面給出乙個例子

a.h

#ifndef _a_h

#define _a_h

#include "b.h"

classa;

#endif

b.h

#ifndef _b_h

#define _b_h

#include "a.h"

classb;

#endif

main.cpp

#include "a.h"

#include "b.h"

int main(int argc, char

const *argv)

編譯報錯

# wenxiaole at wenxiaoledemacbook-pro.local in ~/test [12:33:59]

$ g++ main.cpp

in file included from main.cpp:1:

in file included from ./a.h:3:

./b.h:9:5: error: unknown type name 'a'

a a;

^1error generated.

由於編譯順序的問題,提示型別a未宣告。例如:在編譯a.h時發現包含了b.h,然後去編譯b.h, 發現又引用了a.h,之後就會編譯報錯。

解決該問題的方法是前置宣告。

比如我要蓋乙個屋子(chouse),光有屋子還不行啊,我還得有床(cbed)。但是屋子還沒蓋好,總不能先買床吧,床的大小我定了,改天買。先得把房子蓋好,蓋房子的時候我先給床留個位置,等房子蓋好了,我再決定買什麼樣的床。前置宣告就是我在宣告乙個類(chouse)的時候,用到了另外乙個類的定義(cbed),但是cbed還沒有定義呢,而且我還先不需要cbed的定義,只要知道cbed是乙個類就夠了。那好,我就先宣告類cbed,告訴編譯器cbed是乙個類(不用包含cbed的標頭檔案):然後在chouse中用到cbed的,都用cbed的指標型別代(因為指標型別固定大小的,但是cbed的大小只用知道了cbed定義才能確定)。等到要實現chouse定義的時候,就必須要知道cbed的定義了,那是再包好cbed的標頭檔案就行了。

**示例如下:

a.h

#ifndef _a_h

#define _a_h

class b;//前置宣告,此時不包含b的標頭檔案,否則會重複定義,直到在a.cpp檔案中實現的時候再包含b的標頭檔案。

class a

;#endif

b.h

#ifndef _b_h

#define _b_h

#include "stdio.h"

#include "a.h"

classb};

#endif

a.cpp

#include 

"a.h"

#include

"b.h"

//實現時再包含b的標頭檔案

a::~a()

void a::setb()

main.cpp

#include "a.h"

#include "b.h"

int main(int argc, char

const *argv)

編譯通過

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 的申...

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

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