两个类,相互有一个对方的成员。这样,两个头文件内容如下
//b.h
#include "a.h"class B
{
    A object;        
};//a.h
#include "b.h"class A
{
    B object;    
};在GCC里可以编译通过,在VC里就不行。在头文件里加上了#if !defined ... #define或#pragma once也都没用,不用include用前置声明也通不过。怎么做?

解决方案 »

  1.   

    在每个头文件前,声明一下被包含的类,比如#include "a.h"
    class a;
    class B
    {
        A object;        
    };
    #include "b.h"
    class b;
    class A
    {
        B object;    
    };
      

  2.   

    class a;class b
    {
    ...
    };#include "b.h"
    class a
    {
    ...
    };
      

  3.   

    不行的,预引用只能使用指针(不设计对象的具体内容)而不能使用实例如
    //A.h
    class B;
    class A
    {
       ...
       B * pB;
    }//A.cpp
    #include "B.h"
    ...正确!
    而//A.h
    class B;
    class A
    {
       ...
       B bb;
    }//A.cpp
    #include "B.h"
    ...则错
      

  4.   

    而且感觉楼主a b类的逻辑有问题如果程序中声明A B的实例a b那么就可以a.b.a.b.a.b...这样调用类的成员,无限循环啊,,,
      

  5.   

    两个类,相互有一个对方的成员,这个逻辑没问题。
    互相嵌套包含,那是编译器要解决的事,与我无关。
    GCC就能通过。flyelf(空谷清音) ( ) 的意思,是把b的声明在a.h和b.h里都写一遍吗?
      

  6.   

    为了验证skyxie(黑白精灵) 所说的问题,给A加了个函数,在GCC里做了下实验,结果编译的时候陷入了死循环,对话框一直闪烁,反复链接两个头文件。
    看来VC的作法还是正确的,这种情况应该报错。
    从设计上来讲,的确不应该出现这样的相互包含类。
      

  7.   

    可以让两个头文件不要互相包含,就是在创建一个从A或者B派生出来的类。我今天刚研究了一下MFC的单文档结构,它是这样做的。
    class B
    {
      ...
    }#include "A.h"
    class C: public B
    {
     A * pA;
    }在A.h中
    #include "b.h"
    class A
    {
      B* pC;//
      ...
    }在A.cpp中
    #include "C.h"
    //使用pC的时候做个强制类型转换
    pC = new C();
    ((C*)pC)->....这样就一切搞定