两个类相互包含引用的问题--类前向声明
在構造自己的類時,有可能會碰到兩個類之間的相互引用問題,例如:定義了類A類B,A中使用了B定義的類型,B中也使用了A定義的類型
class A
{
??? int i;
??? B b;
}
class B
{
??? int i;
??? A* a;
}
請注意上面的定義內容,一般情況下是不能出現類A,類B相互引用都定義對象,即如下的樣子:
class A
{
int i;
B b;
}
class B
{
int i;
A?? a;
}
在這種情況下,想想能夠有a.b.a.b.a.b.a.b.a.b…………,很有點子子孫孫無窮盡之狀,那么我的機器也無法承受。最主要的還是這種關系很難存在,也很難管理。這種定義方式類同程式中的死循環。所以,一般來說,兩者的定義,至少有一方是使用指針,或兩者都使用指針,但是決不能兩者都定義實體對象。
言歸正傳,那么,在定義時因為相互引用肯定會需要相互包含頭文檔,假如僅僅只是在各自的頭文檔中包含對方的頭文檔,是通但是編譯的,如下:
//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 *;的申明形式,而在實現文檔中(*.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中的文檔包含處要有下面語句,否則不能調用成員a的任何內容
#include "A.h"
B::B()
{
……
}
兩個類互相用包含
2009-06-14 00:15
當兩個類互相包含 互相在本類中定義另外一個類的對象指針引用時候
因為必須保證當一個類先聲明或者定義時候才可以在另外一個類中使用
所以對于類A B 需要在類A中定義一個B類的對象 指針或引用 在B類中定義一個A類的對象 這樣互相包含
時候 就需要先在類中什么一下要用的類
如在類A的前面聲明Class B 在B類前聲明Class A
然后在頭文件或者CPP文件中加入B.H
或則A.h 這樣就可以互相定義而不產生錯誤了
但是要注意的是上述的方法是只適用于用來定義類指針或者類應用
而不能來定義類對象變量或者函數的變量名 這是因為上面僅僅聲明了類 說明這個類是一個標識 還沒有實現所以不能定義對象變量
但是對于如果想要在一個類中定義對象來說比如 在A,H文件中定義B類對象這樣的話 就需要 在A.H中包含B類頭文件 #include “B.H” 我覺得吧 只有包含了一個類的頭文件 這樣相當于把這個類定義插入到里面了 所以可以直接定義對象 定義對象需要實在的內容 而不僅僅是知識聲明一下類 說明這個類是個標識 必須定義好實體內容 這樣才可以 定義變量
而這種情況下 不能兩個類互相包含了 我一般所見的內容就是定義了B類對象變量后 則只能在B.H中定義 A類指針或者引用了 所以就在B.H里面聲明 CLASS A; 聲明了 就是如此了
確實一般都是如此 兩個類一個包含頭文件 另外一個聲明類 另外在實現文件中當然還得包含這個頭文件了 不要忘了這個 而以為不用包含頭文件 僅僅聲明了類就OK
所以一旦是個類名字聲明 則只能是定義對象指針或引用(無論是單個定義還是對于函數參數 定義都如此) 包含就都可以了
我覺得不能每個里面都定義對象變量 最多一個 否則會產生 死循環
只是不知道要是需要定義兩個對象變量 或者三個類或以上的這樣時候會怎么樣啊
倒是確實是當UpdateData(FALSE)是把數據從變量傳遞到控件中 而TRUE是把控件中內容傳遞到變量中
兩個不同的類相互引用的情況下頭文件包含問題
總結
以上是生活随笔為你收集整理的两个类相互包含引用的问题--类前向声明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个起个快手最好听的名字
- 下一篇: ubuntu 大小写指示的小工具