两个头文件互相包含的问题

luokun 2004-08-24 02:34:55
两个类,相互有一个对方的成员。这样,两个头文件内容如下
//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用前置声明也通不过。怎么做?
...全文
209 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
jjcooljj 2004-08-24
  • 打赏
  • 举报
回复
可以让两个头文件不要互相包含,就是在创建一个从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)->....

这样就一切搞定
luokun 2004-08-24
  • 打赏
  • 举报
回复
为了验证skyxie(黑白精灵) 所说的问题,给A加了个函数,在GCC里做了下实验,结果编译的时候陷入了死循环,对话框一直闪烁,反复链接两个头文件。
看来VC的作法还是正确的,这种情况应该报错。
从设计上来讲,的确不应该出现这样的相互包含类。
csdn_cht 2004-08-24
  • 打赏
  • 举报
回复
教课书上有说嘛,看看好了。
smatter 2004-08-24
  • 打赏
  • 举报
回复
好问题!!!关注!!!
csdn_cht 2004-08-24
  • 打赏
  • 举报
回复
后面包含的文件不能有实体变量被申明只能定义指针变量。
luokun 2004-08-24
  • 打赏
  • 举报
回复
两个类,相互有一个对方的成员,这个逻辑没问题。
互相嵌套包含,那是编译器要解决的事,与我无关。
GCC就能通过。

flyelf(空谷清音) ( ) 的意思,是把b的声明在a.h和b.h里都写一遍吗?
skyxie 2004-08-24
  • 打赏
  • 举报
回复
而且感觉楼主a b类的逻辑有问题

如果程序中声明A B的实例a b

那么就可以a.b.a.b.a.b...这样调用类的成员,无限循环啊,,,
skyxie 2004-08-24
  • 打赏
  • 举报
回复
不行的,预引用只能使用指针(不设计对象的具体内容)而不能使用实例


//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"
...

则错


ncucf 2004-08-24
  • 打赏
  • 举报
回复
晕,我只是说是这种用法!
而你明显逻辑错误啊!

你这样岂不是互相嵌套? 那到底是谁包含谁呢??????????????

互相包含的类只能用“引用”或者“指针”来定义另一个类!
flyelf 2004-08-24
  • 打赏
  • 举报
回复
class a;

class b
{
...
};

#include "b.h"
class a
{
...
};
luokun 2004-08-24
  • 打赏
  • 举报
回复
不行,两个C2079错误。
ncucf 2004-08-24
  • 打赏
  • 举报
回复
在每个头文件前,声明一下被包含的类,比如

#include "a.h"
class a;
class B
{
A object;
};




#include "b.h"
class b;
class A
{
B object;
};

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧