一、使用场景

    假设有两个类A和B,类A要将类B的对象(或者指针)作为自己的成员使用,并且类B将类A的对象(或者指针)作为自己可以访问的数据,那么这个时候要在a.h中include b.h,同时在b.h 中要include a.h,但是相互包含是不可以的,这个时候就要用到类的前向声明了。

    类的前向声明是利用了编译器的特性,编译器在编译的过程中只需要知道各个元素的名称和相应的大小就可以。而在c++中每一个类的大小是固定的,这个时候使用前向声明的类就可以通过编译器。

    比如class foo;

    声明一个foo类,这个声明,有时候也叫做前向声明(forward declaration),在声明完这个foo类之后,定义完这个foo类之前的时期,foo类是一个不完全的类型(incomplete type),也就是说foo类是一个类型,但是这个类型的一些性质(比如包含哪些成员,具有哪些方法)都不知道。所以不能通过这个前向声明的类的指针或者对象去操作自己的成员。

二、使用方法

    假设B类中已经包含了a.h,那么在A类中不能再包含b.h,要在A类中前向声明类B,如下       

//A.h
# include "B.h"
class A
     {
            A(void);
            ~A(void);     
            B b_;  //要包含B.h
        };

  
  //B.h

        class A;
        class B
        {
            B(void);
            ~B(void);
            void fun(A& a)//只能是指针或引用
            {
            }
            //前向声明的类不能实例化对象
            A* a_;  //
        };

三、注意问题

    1. 前向声明的类不能定义对象。

    2. 可以用于定义指向这个类型的指针和引用。

    2. 用于申明使用该类型作为形参或返回类型的函数。