CPP常識 01 -- cpp的前向聲明


轉(zhuǎn)自網(wǎng)絡(luò),來源不可考.

在這里,我想每天來更新一些關(guān)于CPP的,我們應(yīng)該知道的知識,日積月累,我相信一定能夠到達一個比較高的境界的.雖然我以后不一定會使用這門語言.

CPP的前向聲明

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

在構(gòu)造自己的類時希坚,有可能會碰到兩個類之間的相互引用問題,例如:定義了類AB陵且,A中使用了B定義的類型裁僧,B中也使用了A定義的類型:

class A
{
    int i;
    B b;
}

class B
{
    int i;
    A* a;
}

請注意上面的定義內(nèi)容,一般情況下是不能出現(xiàn)類A慕购,類B相互引用都定義對象聊疲,即如下的樣子:

class A
{
    int i;
    B b;
}

class B
{
    int i;
    A a;
}

在這種情況下,想想能夠有a.b.a.b.a.b.a.b.a.b…………沪悲,很有點子子孫孫無窮盡之狀获洲,那么我的機器也無法承受。最主要的還是這種關(guān)系很難存在殿如,也很難管理贡珊。這種定義方式類同程式中的死循環(huán)。所以涉馁,一般來說门岔,兩者的定義,至少有一方是使用指針烤送,或兩者都使用指針寒随,但是決不能兩者都定義實體對象

言歸正傳,那么妻往,在定義時因為相互引用肯定會需要相互包含頭文檔逢防,假如僅僅只是在各自的頭文檔中包含對方的頭文檔,是通但是編譯的蒲讯,如下:

//class A.h
#include "B.h"
class A
{
    int i;
    B b;
}

//class B.h
#include "A.h"
class B
{
    int i;
    A *a;
}

如上的包含方式可能會造成編譯器有錯誤提示:A.h文檔中使用了示知類型B
怎么辦灰署?

一般的做法是:兩個類的頭文檔之中判帮,選一個包含另一個類的頭文檔,但另一個頭文檔中只能采用class *溉箕;的申明形式晦墙,而在實現(xiàn)文檔中(*.cpp)中包含頭文檔,如下:

//class A.h
#include "B.h"
class A
{
    int i;
    B b;
}

//class B.h
class A;
class B
{
    int i;
    A *a;
}

//B.cpp
//在B.cpp中的文檔包含處要有下面語句肴茄,否則不能調(diào)用成員a的任何內(nèi)容
#include "A.h"
B::B()
{
    ……
}

為什么要前向聲明?

我們先舉一個栗子:


//foo.h  
class foo  
{......};  
   
//util.h  
class foo;  
class util  
{  
  private:  
    foo* m_foo;  
};  
  1. 前向聲明用于降低inclusion tree的復(fù)雜程度晌畅,降低模塊間的耦合度。

  2. 前提是前向聲明的類foo只能用來定義指針或者引用寡痰,而不可以定義實體對象抗楔,因為指針占用的空間大小固定,而類實體占用的空間大小必須引入頭文件才能確定拦坠。

前向聲明是一種不完全類型聲明连躏,所以它并不能取代完全類型,對于編譯器來說贞滨,在需要知其被聲明對象大小和內(nèi)容時入热,前向聲明,己不可用晓铆。故其應(yīng)用場景勺良,只有一下兩點:

  • 聲明引用和指針;
  • 作函數(shù)(僅聲明)的返回類型或是參數(shù)類型.
  1. 實現(xiàn)方式是在util.h頭文件中聲明類foo,而不引入頭文件foo.h骄噪。關(guān)于這點尚困,你可能會說,即使util.h文件里不包含foo.h链蕊,但是你util.cpp文件中仍然要包含foo.h尾组。的確。那么問題來了示弓,如果別人要使用你的util類讳侨,就不需要知道foo類的相關(guān)信息了。如果即使foo發(fā)生改變奏属,引用util.h的那文件跨跨,也不需要重新編譯了。如果你將fooutil封裝成庫,那只需要公開util.h就可以了勇婴,foo.h根本不需要露面忱嘹,也就加強了封裝性。否則耕渴,你發(fā)布的庫還必須帶著foo.h一起發(fā)布拘悦。

  2. 對于類和結(jié)構(gòu)體茬高,都可以用以上方式進行聲明媒峡,但是對于結(jié)構(gòu)體树瞭,有一種情況是無法前向聲明的:

   typedef struct{ …… }MyStruct, *MyStruct;

對于這種形式呜笑,你是無法用MyStruct進行前向聲明的由桌。所以盡量不要將結(jié)構(gòu)體設(shè)計成這種形式扯旷,哪怕非得這樣寫庙洼,也給它個名字赵讯,以便前向聲明:
cpp typedef struct _MyStruct{ …… }MyStruct, *MyStruct;

總結(jié)

所以這點的結(jié)論其實很簡單,那就是如果可以的話,盡量多使用cpp的前向聲明,因為這個玩意可以減少依賴,如果很多文件包含了某個頭文件,如果這個頭文件發(fā)生改變,那么這些包含了頭文件的文件都要重新編譯,這是一件非常耗時的事情,這雖然是一個小的知識點,但是用處還是挺大的.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末栏赴,一起剝皮案震驚了整個濱河市蘑斧,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌须眷,老刑警劉巖竖瘾,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異花颗,居然都是意外死亡准浴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門捎稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乐横,“玉大人,你說我怎么就攤上這事今野∑瞎” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵条霜,是天一觀的道長催什。 經(jīng)常有香客問我,道長宰睡,這世上最難降的妖魔是什么蒲凶? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮拆内,結(jié)果婚禮上旋圆,老公的妹妹穿的比我還像新娘。我一直安慰自己麸恍,他們只是感情好灵巧,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布搀矫。 她就那樣靜靜地躺著,像睡著了一般刻肄。 火紅的嫁衣襯著肌膚如雪瓤球。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天敏弃,我揣著相機與錄音卦羡,去河邊找鬼。 笑死麦到,一個胖子當(dāng)著我的面吹牛绿饵,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隅要,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼董济!你這毒婦竟也來了步清?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤虏肾,失蹤者是張志新(化名)和其女友劉穎廓啊,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體封豪,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡谴轮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了吹埠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第步。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖缘琅,靈堂內(nèi)的尸體忽然破棺而出粘都,到底是詐尸還是另有隱情,我是刑警寧澤刷袍,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布翩隧,位于F島的核電站,受9級特大地震影響呻纹,放射性物質(zhì)發(fā)生泄漏堆生。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一雷酪、第九天 我趴在偏房一處隱蔽的房頂上張望淑仆。 院中可真熱鬧,春花似錦哥力、人聲如沸糯景。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蟀淮。三九已至最住,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怠惶,已是汗流浹背涨缚。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留策治,地道東北人脓魏。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像通惫,于是被迫代替她去往敵國和親茂翔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理履腋,服務(wù)發(fā)現(xiàn)珊燎,斷路器,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法遵湖,類相關(guān)的語法悔政,內(nèi)部類的語法,繼承相關(guān)的語法延旧,異常的語法谋国,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,735評論 25 707
  • “誰都想生在好人家,可沒法選擇父母迁沫。發(fā)給你什么樣的牌芦瘾,你就只能盡量打好它〖” ——東野圭吾《時生》 文 |滑翔小仙...
    滑翔小仙女閱讀 873評論 4 4
  • 把這只蝌蚪君想象成一只體型龐大的怪獸旅急,在“空氣之海”中漫游……
    夏風(fēng)澄澈閱讀 414評論 4 3