一个相互include的语法有关问题

一个相互include的语法问题
class B;
class A;



class A
{
public:
B * p;
void fa(){}

A(){p->fb();}
};

class B
{
public:
A * p;
void fb(){}

B(){p->fa();}
};

有以上定义,如果一定这样使用,怎么样声明才可以编译通过
首先说明的是a,b类的嵌套是无法更改而且都没有头文件,怎么办?

------解决方案--------------------
根据题意,稍作改动即可
C/C++ code

class   A;
class   B;
class   A
{
public:
        B*   p;
        void   fa(){}
        A();
};

class   B
{
public:
        A*   p;
        void   fb(){}

        B(){p->fa();}
};
A::A(){p->fb();}

------解决方案--------------------
申明只要做到先申明,后调用,编译就没有问题的啦!
C/C++ code

class   A 
{ 
public: 
B   *   p; 
void   fa(){} 

A();
}; 


class   B 
{ 
public: 
A   *   p; 
void   fb(){} 

B();
}; 

A::A(){p->fb();} 
B::B(){p->fa();}

------解决方案--------------------
C/C++ code

class   B; 
class   A 
{ 
public: 
  B  *p; 
  void  fa() {} 
  A();         //这里仅声明A(),因为class B还没有定义,不能解引用(B *)p ,所以将A()的定义后置
}; 

class   B 
{ 
public: 
  A   *p; 
  void   fb(){} 

  B(){p-> fa();} //这里时class A已经定义,所以可以解引用(A *)p; 
}; 

//后置的A::A()定义
//此时 class B 已经定义,所以可以解引用(B *)p
A::A()
{
  p->fb();
}