<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評(píng)論 - 101, 引用 - 0
    數(shù)據(jù)加載中……

    超前引用

    ????所謂超前引用是指一個(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"類型沒(méi)有定義之類的錯(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è)頭文件的開(kāi)頭分別用class ClassB;和class ClassA;聲明對(duì)方
    ????????????c) 在兩個(gè)cpp文件中分別包含另外一個(gè)類的頭文件
    ???? NOTE:這種方法切記不可使用類名來(lái)定義變量和函數(shù)的變量參數(shù),只可用來(lái)定義引用或者指針。
    ????
    ???? 2) 使用全局變量
    ???? 由于全局變量可以避免超前引用,不用贅述。我的習(xí)慣是,把類對(duì)象的extern語(yǔ)句加在該類頭文件的最后,大家喜歡
    怎樣寫那都沒(méi)有什么大問(wèn)題,關(guān)鍵是保證不要在頭文件中胡亂包含。
    ????3) 使用基類指針。
    ????這種方法是在引用超前引用類的地方一律用基類指針。而一般情況下,兩個(gè)互相引用的類并不涉及其基類,因此不會(huì)造成
    超前引用。以開(kāi)始的例子說(shuō):在CMyDialog類中用CView*代替CMyView*,在CMyView類中用CDialog*代替CMyDialog*,這樣必然
    不會(huì)造成超前引用。


    ????說(shuō)明:本文中,為了敘述方便,把class AClass;語(yǔ)句成為類AClass的聲明,把class AClass開(kāi)始的對(duì)AClass的類成員變量、
    成員函數(shù)原型等的說(shuō)明稱為類的定義,而把在CPP中的部分稱為類的定義。如果大家對(duì)這三個(gè)詞有不同的理解,請(qǐng)按照自己的本意
    把這三個(gè)詞換成相應(yīng)的詞來(lái)理解。

    from: http://www.vckbase.com/bbs/prime/viewprime.asp?id=431

    posted on 2006-11-11 15:16 weidagang2046 閱讀(591) 評(píng)論(0)  編輯  收藏 所屬分類: Windows

    主站蜘蛛池模板: 午夜无码A级毛片免费视频| 成人免费视频一区| 亚洲综合无码一区二区三区| 麻豆视频免费播放| 国产成人亚洲毛片| 亚洲国产精品成人精品无码区| 成人免费视频77777| 国产亚洲精彩视频| 亚洲综合婷婷久久| 小小影视日本动漫观看免费| 久久久99精品免费观看| 中文字幕在线日亚洲9| 国产亚洲色婷婷久久99精品91| 精品女同一区二区三区免费站| 国产午夜亚洲精品不卡电影| 国产精品亚洲片在线观看不卡| 成人最新午夜免费视频| 久久久WWW免费人成精品| 亚洲日韩乱码中文无码蜜桃臀| 亚洲AV无码一区二三区 | 四虎精品免费永久免费视频| 91亚洲国产成人精品下载| 亚洲?v女人的天堂在线观看| 91高清免费国产自产| 亚洲一区二区三区免费| 亚洲一区精彩视频| 无码乱人伦一区二区亚洲一| 亚洲国产天堂久久久久久| 全部免费国产潢色一级| 美丽姑娘免费观看在线观看中文版| 色吊丝免费观看网站| 亚洲国产夜色在线观看| 亚洲成A人片在线观看WWW| 亚洲国产成人久久综合野外| 成人午夜视频免费| 亚洲中文字幕无码mv| 2048亚洲精品国产| 免费看少妇作爱视频| www.999精品视频观看免费| 午夜视频免费在线观看| h视频在线免费观看|