VC++開發(fā)中完美解決頭文件相互包含問(wèn)題的方法解析
所謂超前引用是指一個(gè)類型在定義之前就被用來(lái)定義變量和聲明函數(shù)。
一般情況下,C/C++要求所有的類型必須在使用前被定義,但是在一些特殊情況下,這種要求無(wú)法滿足,例如,在類CMyView中保留了一個(gè)非模式對(duì)話框?qū)ο笾羔?,該?duì)象用于顯示/修改一些信息。為了實(shí)現(xiàn)對(duì)話框"應(yīng)用"按鈕,把對(duì)話框做的修改立刻更新到view界面上,為此,需要在對(duì)話框類中需要保存view類的指針,這樣定義關(guān)系就變成如下的代碼:
#ifndef __MYVIEW_H__
#define __MYVIEW_H__
//這是view類的頭函數(shù)
#include "MyDialog.h"
class CMyView::public CView
{
protected:
CMyDialog * pDlg;
//這里是其他定義
};
#endif
#ifndef __MYDIALOG_H__
#define __MYDIALOG_H__
//這是對(duì)話框類的定義
#include "MyView.h"
class CMyDialog::public CDialog
{
protected:
CMyView * pView;
//其他定義
};
#endif
從編譯器角度看,編譯MyDialog.CPP時(shí),系統(tǒng)首先定義宏__MYDIALOG_H__,然后包含MyView.h,MyView.h中的#include "MyDialog.h"由于__MYDIALOG_H__已經(jīng)定義,所以不再起作用。在CMyView類的聲明中,CMyDialog* pDlg ;就會(huì)讓編譯器產(chǎn)生"CMyDialog"類型沒有定義之類的錯(cuò)誤,編譯MyView.CPP文件出現(xiàn)的錯(cuò)誤可以類似得到。
一般的情況,類A和類B需要彼此互相引用,這樣必然有一個(gè)類會(huì)先被定義,而另外一個(gè)類后被定義,這樣在先被定義的類引用后被定義的類的時(shí)候,就導(dǎo)致了所謂的超前引用。
超前引用導(dǎo)致的錯(cuò)誤有以下幾種處理辦法:
1) 使用類聲明
在超前引用一個(gè)類之前,首先用一個(gè)特殊的語(yǔ)句說(shuō)明該標(biāo)識(shí)符是一個(gè)類名,即將被超前引用。其使用方法是:
a) 用class ClassB;聲明即將超前引用的類名
b) 定義class ClassA
c) 定義class ClassB;
d) 編制兩個(gè)類的實(shí)現(xiàn)代碼。
上述方法適用于所有代碼在同一個(gè)文件中,一般情況下,ClassA和ClassB分別有自己的頭文件和cpp文件,這種
方法需要演變成:
a) 分別定義ClassA和ClassB,并在cpp文件中實(shí)現(xiàn)之
b) 在兩個(gè)頭文件的開頭分別用class ClassB;和class ClassA;聲明對(duì)方
c) 在兩個(gè)cpp文件中分別包含另外一個(gè)類的頭文件
NOTE:這種方法切記不可使用類名來(lái)定義變量和函數(shù)的變量參數(shù),只可用來(lái)定義引用或者指針。
2) 使用全局變量
由于全局變量可以避免超前引用,不用贅述。我的習(xí)慣是,把類對(duì)象的extern語(yǔ)句加在該類頭文件的最后,大家喜歡怎樣寫那都沒有什么大問(wèn)題,關(guān)鍵是保證不要在頭文件中胡亂包含。
3) 使用基類指針。
這種方法是在引用超前引用類的地方一律用基類指針。而一般情況下,兩個(gè)互相引用的類并不涉及其基類,因此不會(huì)造成超前引用。以開始的例子說(shuō):在CMyDialog類中用CView*代替CMyView*,在CMyView類中用CDialog*代替CMyDialog*,這樣必然不會(huì)造成超前引用。
說(shuō)明:本文中,為了敘述方便,把class AClass;語(yǔ)句成為類AClass的聲明,把class AClass開始的對(duì)AClass的類成員變量、成員函數(shù)原型等的說(shuō)明稱為類的定義,而把在CPP中的部分稱為類的定義。如果大家對(duì)這三個(gè)詞有不同的理解,請(qǐng)按照自己的本意把這三個(gè)詞換成相應(yīng)的詞來(lái)理解。
ps:我是用第一種方法解決問(wèn)題的。
欄 目:C語(yǔ)言
本文標(biāo)題:VC++開發(fā)中完美解決頭文件相互包含問(wèn)題的方法解析
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/4128.html
您可能感興趣的文章
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 01-10深入理解C++中常見的關(guān)鍵字含義
- 01-10深入Main函數(shù)中的參數(shù)argc,argv的使用詳解
- 01-10APUE筆記之:進(jìn)程環(huán)境詳解
- 01-10c++中inline的用法分析
- 01-10如何尋找數(shù)組中的第二大數(shù)
- 01-10C++大數(shù)模板(推薦)


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 04-02jquery與jsp,用jquery
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)