c 中兩個類互相包含引用怎麼處理

2021-10-01 13:18:37 字數 3863 閱讀 6253

在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如:定義了類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

class a

//class b.h

class b

一般的做法是:兩個類的頭文件之中,選乙個包含另乙個類的頭文件,但另乙個頭文件中只能採用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類的物件 這樣互相包含

時候 就需要先在類中什麼一下要用的類

在類a的前面宣告class b 在b類前宣告class a

然後在標頭檔案或者cpp檔案中加入b.h

或則a.h 這樣就可以互相定義而不產生錯誤了

但是要注意的是上述的方法是只適用於用來定義類指標或者類應用

而不能來定義類物件變數或者函式的變數名 這是因為上面僅僅宣告了類 說明這個類是乙個標識 還沒有實現所以不能定義物件變數

但是對於如果想要在乙個類中定義物件來說比如 在a,**件中定義b類物件這樣的話 就需要 在a.h中包含b類標頭檔案 #include 「b.h」 我覺得吧 只有包含了乙個類的標頭檔案 這樣相當於把這個類定義插入到裡面了 所以可以直接定義物件 定義物件需要實在的內容 而不僅僅是知識宣告一下類 說明這個類是個標識 必須定義好實體內容 這樣才可以 定義變數

而這種情況下 不能兩個類互相包含了 我一般所見的內容就是定義了b類物件變數後 則只能在b.h中定義 a類指標或者引用了 所以就在b.h裡面宣告 class a; 宣告了 就是如此了

確實一般都是如此 兩個類乙個包含標頭檔案 另外乙個宣告類 另外在實現檔案中當然還得包含這個標頭檔案了 不要忘了這個 而以為不用包含標頭檔案 僅僅宣告了類就ok

所以一旦是個類名字宣告 則只能是定義物件指標或引用(無論是單個定義還是對於函式引數 定義都如此) 包含就都可以了

我覺得不能每個裡面都定義物件變數 最多乙個 否則會產生 死迴圈

只是不知道要是需要定義兩個物件變數 或者三個類或以上的這樣時候會怎麼樣啊

倒是確實是當updatedata(false)是把資料從變數傳遞到控制項中 而true是把控制項中內容傳遞到變數中

兩個類a和b實現互相呼叫彼此的方法,如果採用彼此包含對方標頭檔案的方式會出現迴圈引用,所以採用了類的前置宣告的方式

1,class a採用前置宣告的方式宣告class b

2,在classb的標頭檔案中包含class a 的標頭檔案

3,在class a中只能宣告class b型別的指標或者引用

具體**如下:

a.h:

#pragma once

class b;

class a

;a,cpp

#include "a.h"

#include "b.h"

#include using namespace std;

a::a()

a::a(b * pb)

a::~a()

void a::displaya()

void a::invokeclassbinclassa()

b.h

#pragma once

#include "a.h"

class b;

b.cpp

#include "b.h"

#include using namespace std;

b::b()

b::~b()

void b::displayb()

void b::invokeclassainclassb()

main.cpp

#include #include "a.h"

#include "b.h"

using namespace std;

int main()

一、問題描述

現在有兩個類a和b需要定義,定義a的時候需要用到b,定義b的時候需要用到a。

二、分析

a和b的定義和呼叫都放在乙個檔案中肯定是不可以的,這樣就會造成兩個迴圈呼叫的死迴圈。

根本原因是:定義a的時候,a的裡面有b,所以就需要去檢視b的佔空間大小,但是檢視的時候又發現需要知道a的佔空間大小,造成死迴圈。

解決方法:

(1)寫兩個標頭檔案a.h和b.h分別用於宣告類a和b;

(2)寫兩個.cpp檔案分別用於定義類a和b;

(3)在a的標頭檔案中匯入b的標頭檔案;

(4)在b的標頭檔案中不匯入a的標頭檔案,但是用extern 的方式宣告類a,並且,在b中使用a的時候要用指標的形式。

原理:在b中用指標呼叫a,那麼在a需要知道b佔空間大小的時候,就會去找到b的定義檔案,雖然b的定義檔案中並沒有匯入a的標頭檔案,不知道a的佔空間大小,但是由於在b中呼叫a的時候用的指標形式,b只知道指標佔4個位元組就可以,不需要知道a真正佔空間大小,也就是說,a也是知道b的佔空間大小的。

三、c++示例

a的標頭檔案a.h:

#ifndef _a

#define _a#include "b.h"//a的標頭檔案匯入了b的標頭檔案//extern class b;

class a;

#endif _a

b的標頭檔案b.h:

#ifndef _b

#define _b//#include "a.h"//b的標頭檔案沒有匯入a的標頭檔案,需要有三個地方需要注意!

extern class a;//注意1:需要用extern宣告aclass b;

#endif _b

a的定義檔案a.cpp:

#include#include "a.h"using namespace std;

a::a()

int a::geta()

void a::handle()

int b::getb()

void b::handle()

四、注意

下面情況編譯不能通過:

a.h中包含b.h且b.h中包含a.h

C 中兩個類互相引用

一 問題描述 現在有兩個類a和b需要定義,定義a的時候需要用到b,定義b的時候需要用到a。二 分析 a和b的定義和呼叫都放在乙個檔案中肯定是不可以的,這樣就會造成兩個迴圈呼叫的死迴圈。根本原因是 定義a的時候,a的裡面有b,所以就需要去檢視b的佔空間大小,但是檢視的時候又發現需要知道a的佔空間大小,...

c 中兩個類互相引用的問題

最近在改乙個c 程式的時候碰到一條警告資訊,警告資訊為 刪除指向不完整 q2dtorusnode 型別的指標 沒有呼叫析構函式 1 c users lxw desktop dragonfly第二階段實驗 最終的實驗版本 實驗目錄 dragonfly modify src q2dtorus.h 6 參...

c 中兩個類互相引用的問題

最近在改乙個c 程式的時候碰到一條警告資訊,警告資訊為 刪除指向不完整 q2dtorusnode 型別的指標 沒有呼叫析構函式 1 c users lxw desktop dragonfly第二階段實驗 最終的實驗版本 實驗目錄 dragonfly modify src q2dtorus.h 6 參...