在實際解決問題中,很可能出現兩個類相互引用的情況,這種情成爲相互依賴.
//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類定義了才能確定)
- B*b;必須用指針或引用(因爲指針類型固定大小的,但是B的大小隻用知道了B類定義了才能確定)
- 不能在A的申明中使用B的方法(B類的定義都沒有,怎麼使用B的方法.)