C++クラスの前向き宣言の学習



2つのクラスAとBを宣言すると仮定し、A.hでBクラスオブジェクトを定義する必要がある場合、B b_;必ず#include"B.h"を含む必要がありますが、BクラスではAクラスオブジェクトA a_を定義する必要があります.B.hも含まなければならないが、互いに含まれることは許されない.リングリファレンスと呼ばれ、このとき前方宣言が用いられる.
Bクラスで順方向宣言を行います.

  
  
  
  
  1. class A; 

B.hにはA.hを含める必要はありませんが、オブジェクトを定義することはできず、ポインタや参照のみを定義することが前提です.
 
Aクラス
 

  
  
  
  
  1. //A.h 
  2.  
  3. # ifndef _A_H_ 
  4. # define _A_H_ 
  5.  
  6. # include "B.h" 
  7.  
  8. class A 
  9.     A(void); 
  10.     ~A(void); 
  11.      
  12.     B b_;  // B.h 
  13. }; 
  14.  
  15. # endif //_A_H 

B.h
 

  
  
  
  
  1. //B.h 
  2. # ifndef _B_H_ 
  3. # define _B_H_ 
  4. // ,  
  5. class A;  //  A.h, ,  
  6. // ,  
  7.  
  8. class B 
  9.     B(void); 
  10.     ~B(void); 
  11.  
  12.     void fun(A& a)//  
  13.     { 
  14.         ; 
  15.     } 
  16.     //  
  17.     A* a_;  // 
  18. }; 
  19.  
  20. # endif //_B_H_ 

B.cpp
 

  
  
  
  
  1. B.cpp 
  2.  
  3. # include "B.h" 
  4. # include "A.h" 
  5.  
  6. B::B(void
  7.  
  8. B::~B() 
  9.  

まとめ:
前方に宣言されたクラスはオブジェクトをインスタンス化できません.