前置申明的應用

在實際解決問題中,很可能出現兩個類相互引用的情況,這種情成爲相互依賴.

//a.h
#ifndef A_H
#define A_H
#include"b.h"
class A{
    B b;
    public:
    A ();
    ~A();
};
#endif // A_H


//b.h
#ifndef B_H
#define B_H
#include"a.h"
class B{
    A a;
public:
    B();
    ~B();
};

#endif // B_H


//main.cpp
#include <iostream>
#include"a.h"
#include"b.h"
A::A(){

}
A::~A(){

}
B::B(){


}
B::~B(){

}

using namespace std;

int main(int argc, char *argv[])
{
    A a;
    B b;
    cout << "Hello World!" << endl;
    return 0;
}
當出現類似以上代碼的情況時,編譯是無法通過的.根據老師指導,得知這時候出現了頭文件的循環調用,即在a.h中調用了b.h,而在b.h中又調用了a.h如此這樣陷入死循環. 
所以這時候就需要用到前置申明. 
前置聲明就是我在聲明一個類(A)的時候,用到了另外一個類的定義(B),但是B還沒有定義呢,而且我還先不需要B的定義,只要知道B是一個類就夠了。 

需要注意的是,如果採用了前置申明,則在A類中只能採用B的指針類型(因爲指針類型固定大小的,但是B的大小隻用知道了B類定義了才能確定)

  1. B*b;必須用指針或引用(因爲指針類型固定大小的,但是B的大小隻用知道了B類定義了才能確定)
  2. 不能在A的申明中使用B的方法(B類的定義都沒有,怎麼使用B的方法.)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章