可以宣告乙個類而不定義它
class screen;//declaration of the screen class
這個宣告,有時候被稱為前向宣告(forward declaration),在程式中引入了類型別的screen.在宣告之後,定義之前,類screen是乙個不完全型別(incompete type),即已知screen是乙個型別,但不知道包含哪些成員.
不完全型別只能以有限方式使用,不能定義該型別的物件,不完全型別只能用於定義指向該型別的指標及引用,或者用於宣告(而不是定義)使用該型別作為形參型別或返回型別的函式.
對於c++中,類的定義之前宣告它,如下例項**:
class b;
class a;
class b;
被提前宣告的類在其定義之前,只能使用該類的指標或者引用 。
在類的定義結束(編譯器在遇到類定義的右花括號之後),用該類來宣告類例項物件,或物件指標,引用都是合法的。
前向宣告
超前引用
所謂超前引用是指乙個型別在定義之前就被用來定義變數和宣告函式。
一般情況下,
c/c++
要求所有的型別必須在使用前被定義,但是在一些特殊情況下,這種要求無法滿足,
例如,在類cmyview
中保留了乙個非模式對話方塊物件指標,該物件用於顯示
/修改一些資訊。為了實現對話方塊
「應用」
按鈕,把對話方塊做的修改立刻更新到
view
介面上,為此,需要在對話方塊類中需要儲存
view
類的指標,這樣
定義關係就變成如下的**:
#ifndef __myview_h__
#define __myview_h__
//這是
view
類的頭函式
#include "mydialog.h"
class cmyview::public cview
;#endif
#ifndef __mydialog_h__
#define __mydialog_h__
//這是對話方塊類的定義
#include "myview.h"
class cmydialog::public cdialog
;#endif
從編譯器角度看,編譯
mydialog.cpp
時,系統首先定義巨集
__mydialog_h__
,然後包含
myview.h
,myview.h
中的#include "mydialog.h"
由於__mydialog_h__
已經定義,所以不再起作用。在
cmyview
類的宣告中,
cmydialog* pdlg ;
就會讓編譯器產生「cmydialog"
型別沒有定義之類的錯誤,編譯
myview.cpp
檔案出現的錯誤可以類似得到。
更一般的情況,類a和類
b需要彼此互相引用,這樣必然有乙個類會先被定義,而另外乙個類後被定義,這樣在
先被定義的類引用後被定義的類的時候,就導致了所謂的超前引用。
超前引用導致的錯誤有以下幾種處理辦法:
1) 使用類宣告
在超前引用乙個類之前,首先用乙個特殊的語句說明該識別符號是乙個類名,即將被超前引用。其使用方法是:
a) 用
class classb
;宣告即將超前引用的類名
b) 定義
class classa
c) 定義
class classb;
d) 編制兩個類的實現**。
上述方法適用於所有**在同乙個檔案中,一般情況下,
classa
和classb
分別有自己的標頭檔案和
cpp檔案,這種
方法需要演變成:
a) 分別定義
classa
和classb
,並在cpp
檔案中實現之
b) 在兩個標頭檔案的開頭分別用
class classb;
和class classa;
宣告對方
c) 在兩個
cpp檔案中分別包含另外乙個類的標頭檔案
note:這種方法切記不可使用類名來定義變數和函式的變數引數,只可用來定義引用或者指標。
2) 使用全域性變數
由於全域性變數可以避免超前引用,不用贅述。我的習慣是,把類物件的
extern
語句加在該類標頭檔案的最後,大家喜歡
怎樣寫那都沒有什麼大問題,關鍵是保證不要在標頭檔案中胡亂包含。
3) 使用基類指標。
這種方法是在引用超前引用類的地方一律用基類指標。而一般情況下,兩個互相引用的類並不涉及其基類,因此不會造成
超前引用。以開始的例子說:在cmydialog
類中用cview*
代替cmyview*
,在cmyview
類中用cdialog*
代替cmydialog*
,這樣必然
不會造成超前引用。
說明:本文中,為了敘述方便,把
class aclass;
語句成為類
aclass
的宣告,把
class aclass
開始的對
aclass
的類成員變數、
成員函式原型等的說明稱為類的定義,而把在cpp
中的部分稱為類的定義。如果大家對這三個詞有不同的理解,請按照自己的本意
把這三個詞換成相應的詞來理解。
C 中類的宣告
可以宣告乙個類而不定義它 class screen declaration of the screen class 這個宣告,有時候被稱為前向宣告 forward declaration 在程式中引入了類型別的screen.在宣告之後,定義之前,類screen是乙個不完全型別 incompete t...
C 中類的宣告
類就是用class來宣告的。class的語法如下 類的訪問修飾符 class 類名 除class關鍵字和類名外,訪問修飾符是可選項。下面以汽車為例宣告乙個類,如下 public class car 類命名要遵循的編碼規則 類命名應該採用帕斯卡命名法,即首字母大寫。通常命名類採用完整的英文單詞,如bo...
C 中類的宣告
一 c 中類的宣告 在c 中必須先宣告類,然後才能在程式中使用。類的宣告格式如下 類的屬性 訪問修飾符 class 類名稱 父類名 類的屬性 類的屬性集。訪問修飾符 說明類的特性。類的修飾符可以是以下幾種之一或者是它們的組合 new 只允許在巢狀類宣告時使用,表明類中隱藏了由基類中繼承而來的並且與基...