解決標頭檔案相互包含問題的方法
阿新 • • 發佈:2019-01-24
一般情況下,C/C++要求所有的型別必須在使用前被定義,但是在一些特殊情況下,這種要求無法滿足,例如,在類CMyView中保留了一個非模式對話方塊物件指標,該物件用於顯示/修改一些資訊。為了實現對話方塊"應用"按鈕,把對話方塊做的修改立刻更新到view介面上,為此,需要在對話方塊類中需要儲存view類的指標,這樣定義關係就變成如下的程式碼:
#ifndef __MYVIEW_H__
#define __MYVIEW_H__
//這是view類的頭函式
#include "MyDialog.h"
class CMyView::public CView
{
protected:
CMyDialog * pDlg;
//這裡是其他定義
};
#endif
#ifndef __MYDIALOG_H__
#define __MYDIALOG_H__
//這是對話方塊類的定義
#include "MyView.h"
class CMyDialog::public CDialog
{
protected:
CMyView * pView;
//其他定義
};
#endif
從編譯器角度看,編譯MyDialog.CPP時,系統首先定義巨集__MYDIALOG_H__,然後包含MyView.h,MyView.h中的#include "MyDialog.h"由於__MYDIALOG_H__已經定義,所以不再起作用。在CMyView類的宣告中,CMyDialog* pDlg ;就會讓編譯器產生"CMyDialog"型別沒有定義之類的錯誤,編譯MyView.CPP檔案出現的錯誤可以類似得到。
更一般的情況,類A和類B需要彼此互相引用,這樣必然有一個類會先被定義,而另外一個類後被定義,這樣在先被定義的類引用後被定義的類的時候,就導致了所謂的超前引用。
超前引用導致的錯誤有以下幾種處理辦法:
#ifndef __MYVIEW_H__
#define __MYVIEW_H__
//這是view類的頭函式
#include "MyDialog.h"
class CMyView::public CView
{
protected:
CMyDialog * pDlg;
//這裡是其他定義
};
#endif
#ifndef __MYDIALOG_H__
#define __MYDIALOG_H__
//這是對話方塊類的定義
#include "MyView.h"
class CMyDialog::public CDialog
{
protected:
CMyView * pView;
//其他定義
};
#endif
從編譯器角度看,編譯MyDialog.CPP時,系統首先定義巨集__MYDIALOG_H__,然後包含MyView.h,MyView.h中的#include "MyDialog.h"由於__MYDIALOG_H__已經定義,所以不再起作用。在CMyView類的宣告中,CMyDialog* pDlg ;就會讓編譯器產生"CMyDialog"型別沒有定義之類的錯誤,編譯MyView.CPP檔案出現的錯誤可以類似得到。
更一般的情況,類A和類B需要彼此互相引用,這樣必然有一個類會先被定義,而另外一個類後被定義,這樣在先被定義的類引用後被定義的類的時候,就導致了所謂的超前引用。
超前引用導致的錯誤有以下幾種處理辦法: