類的交叉引用(或標頭檔案依賴與交叉包含)

2021-06-28 20:51:24 字數 1759 閱讀 4774

注:類的交叉引用本身就是一種不好的設計,但是,有時我們又不得不這樣用。

《一》問題

兩種常見情況:

(1)直接相互引用

模型:a.h中#include "b.h"

b.h中#include "a.h"

(2)傳遞式相互引用(或者叫環形)

模型:a.h中#include "b.h"

b.h中#include "c.h"

c.h中#include "a.h"

b代表中間層,可以是多個

《二》現象

以下面的**為例:

main.cpp

[cpp]view plain

copy

print

?#include 

#include "class_a.h"

#include "class_b.h"

intmain()    

class_a.h

[cpp]view plain

copy

print

?#ifndef class_a_h

#define class_a_h

#include "class_b.h"

class

a    

void

print()  

};  

#endif

class_b.h

[cpp]view plain

copy

print

?#ifndef class_b_h

#define class_b_h

#include "class_a.h"

class

b    

void

print()  

};  

#endif

錯誤現象:此處我們用#ifndef...#endif保護機制,導致編譯器(vs2012)認為在class_b.h中,a仍然是未宣告的識別符號。

如果去掉這個保護機制,又會引起「重定義」或者「包含檔案太多,深度=1024」等問題。

《三》解決辦法

(1)提前宣告

這個雖然可行,但是存在風險。這種方法切記不可使用類名來定義變數和函式的變數引數,只可用來定義引用或者指標。因為前導宣告只是乙個符號宣告,不能知道實際物件的大小,引用的物件只能是指標型別

(2)挪動該型別定義

這個方法很容易想到,你不是說我使用前沒宣告嘛,那好啊,我直接把它**搬到你那個#include前不就完了麼。也就等於把順序梳理了下。但這樣會**不大好看。

(3)抽出來放置於公共標頭檔案

這個就相當於給新建了個安置地方,直接就把環給解了。

提前宣告的例子:前導宣告代替標頭檔案依賴和交叉包含

1.標頭檔案中使用前導宣告替代交叉引用,由於前導宣告只是乙個符號宣告,不能知道實際物件的大小,引用的物件只能是指標型別。

2.原始檔中包含自己的標頭檔案。

a.h

class

b;classa;

b.h

class

a;classb;

a.cpp

#include 

"a.h

"a::a()

b.cpp

#include 

"b.h

"b::b()

C或C 引用標頭檔案的方法

經常會遇到兩種include引用標頭檔案的情況,其實區別很簡單,如下 include 引用的是編譯器類庫路徑裡面的標頭檔案。假如你編譯器定義的自帶標頭檔案引用在c keil c51 inc 下,則 include 引用的就是c keil c51 inc stdio.h 這個標頭檔案,不管你的專案在什...

交叉引用的解決方法 類宣告的應用

什麼是交叉引用?一言以蔽之,就是 a類中包含b類的物件,b類中包含a類的物件。我們先來看乙個場景。假設有乙個電子文件 document 乙個文件下有多個頁 page 每個頁下有多個文字單元 textunit,表示文件內元素的基本單位 乙個文件中的所有文字單元物件都有唯一的id。這樣每建立乙個文字單元...

交叉引用的解決方法 類方法的應用

什麼是交叉引用?什麼是交叉引用?一言以蔽之,就是 a類中包含b類的物件,b類中包含a類的物件。以一場景為例 我們先來看乙個場景。假設有乙個電子文件 document 乙個文件下有多個頁 page 每個頁下有多個文字單元 textunit,表示文件內元素的基本單位 乙個文件中的所有文字單元物件都有唯一...