假設聲明兩個類A和B,若是須要在A.h中定義B類對象,B b_; 勢必要包含# include "B.h",而B類中須要定義A類對象A a_; 也要包含B.h,可是相互包含是不容許的,稱爲環形引用,這時候就用到了前向聲明。ide
在B類中進行前向聲明:spa
- class A;
B.h中就不用包含A.h,可是前提是,不能定義對象,只能定義指針或引用。指針
A類對象
- //A.h
- # ifndef _A_H_
- # define _A_H_
- # include "B.h"
- class A
- {
- A(void);
- ~A(void);
- B b_; //要包含B.h
- };
- # endif //_A_H
B.h內存
- //B.h
- # ifndef _B_H_
- # define _B_H_
- //前向聲明,不能實例化對象
- class A; // 就不須要包含A.h,要求不能定義對象,只能給定義指針和引用
- //由於咱們不知道類長聲明樣子,就沒法爲其分配內存
- class B
- {
- B(void);
- ~B(void);
- void fun(A& a)//只能是指針或引用
- {
- ;
- }
- //前向聲明的類不能實例化對象
- A* a_; //
- };
- # endif //_B_H_
B.cppit
- B.cpp
- # include "B.h"
- # include "A.h"
- B::B(void)
- {
- }
- B::~B()
- {
- }
總結:class
前向聲明的類不能實例化對象。sso