请教一个C++类互相包含的问题

winux1062 2012-11-19 10:47:02
问题描述:存在两个类的头文件a.h和b.h,在a.h中有这样的语句:#include "b.h",在b.h文件中有这样的语句:#include "a.h" 且在一个类中有另一个类的对象,如下例子:

// a.h
#ifndef A_H_INCLUDED
#define A_H_INCLUDED

class A
{
private:
B b;
};

#endif // A_H_INCLUDED

// a.cpp 仅仅作为例子, 没什么意义
#include "a.h"

// b.h
#ifndef B_H_INCLUDED
#define B_H_INCLUDED

class B
{
private:
A a;
};


#endif // B_H_INCLUDED

// b.cpp
#include "b.h"

// main.cpp
#include <iostream>

using namespace std;

int main()
{
return 0;
}


在CB下的工作目录如下图,

我试了, 嵌套头文件和在头文件中先声明类都不行。。。。。
请问, 怎么解决这个问题, 请不要说把2个文件合一的方法, 谢谢!
...全文
1877 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
柔情铁汉h 2012-11-26
  • 打赏
  • 举报
回复
解决方法有2: 1.pimp手法,也即回复中有人说的在h文件中用指针加上一个前置声明,在cpp文件中再包含的头文件。但lz貌似不想用指针 2.使用继承。boost,asio里面的一个聊天室例子就使用这种手法。在a.h中定义class a和class b_base,b.h中class b继承b_base。
fuvyuv 2012-11-26
  • 打赏
  • 举报
回复
定,遇到过类似的问题啊,学习了
深圳大哥 2012-11-24
  • 打赏
  • 举报
回复
引用 30 楼 tonywearme 的回复:
楼主,可以参考这篇文章: Incomplete type与Foreward declaration
哇,写的真好
ao929929fei 2012-11-24
  • 打赏
  • 举报
回复
楼主的写法是刚学习C++的同学的写法 这种写法非常不好,维护和理解都不好 现在我一般注册回调函数,层次清晰,编译方便,便于维护。A可以直接调用B的函数,B间接调用A的函数。
c1230v 2012-11-24
  • 打赏
  • 举报
回复
引用 9 楼 yisikaipu 的回复:
头文件根本不是问题,问题是不允许这样嵌套定义 C/C++ code?123456789101112131415class B;class A{ B b;}; class B{ A a;}; int main(){ return 0;}
是不允许的,你需要class A{ B *b;}
gongfupanda2 2012-11-24
  • 打赏
  • 举报
回复
前向声明。。。。我之前也有过这种情况
yujie_v 2012-11-22
  • 打赏
  • 举报
回复
这是不行的,不能循环引用。弄个前置声明就可以。
winux1062 2012-11-21
  • 打赏
  • 举报
回复
大家回答的都很犀利, 但是分不多, 谢谢网大家了, 结贴!
Saingel 2012-11-21
  • 打赏
  • 举报
回复
不允许的,因为嵌套了编译器就无法计算类对象的大小了,除非定义成指针
qin_zhu 2012-11-21
  • 打赏
  • 举报
回复
声明成一个类指针呗。。
tonywearme 2012-11-21
  • 打赏
  • 举报
回复
楼主,可以参考这篇文章: Incomplete type与Foreward declaration
yisikaipu 2012-11-21
  • 打赏
  • 举报
回复
引用 27 楼 WJ_1062 的回复:
你说的很对!是这样的!我私下请教你一下, 那些预处理后的文件怎么是什么意思啊?
这个不懂,具体查编译器手册了
牛奶味的榴莲 2012-11-21
  • 打赏
  • 举报
回复
我也遇到过这样的问题,是我在做项目的时候单文档view类包含一个dialog类,但是dialog又需要用到view类。我的解决办法是使用另外一个类做中间类记录需要传递的变量。重复包含是违背语法的事情,不会有什么方法可以放到一起的。
漫步者、 2012-11-20
  • 打赏
  • 举报
回复
引用 17 楼 WJ_1062 的回复:
引用 9 楼 yisikaipu 的回复:头文件根本不是问题,问题是不允许这样嵌套定义 C/C++ code?123456789101112131415class B;class A{ B b;}; class B{ A a;}; int main(){ return 0;} 我晕!不好意思,又TM的犯错了, 没有亲自动手, 就胡言乱语!2个文件……
不能2合1的,循环调用,会出现对象未定义!
漫步者、 2012-11-20
  • 打赏
  • 举报
回复
引用 14 楼 WJ_1062 的回复:
引用 7 楼 ganpengjin1 的回复:引用 4 楼 WJ_1062 的回复:引用 2 楼 steed_jet 的回复:在头文件中声明一下看看行不,像下面的样子 C/C++ code?12345678910#ifndef A_H_INCLUDED#define A_H_INCLUDED class B;class A{private: B b;}; #en……
这种循环使用对象及其文件的,这种行为是不合法的! 那个我刚开始没有在另外一个文件中调用A,B,所以可以骗过编译器,但是你在一个文件中同时调用的时候,就不可以了!
sniffer12345 2012-11-20
  • 打赏
  • 举报
回复
本来就是先有鸡还是先有蛋的问题 你必须得换成指针,指针其实就一整数,这样才能解决鸡蛋问题
baichi4141 2012-11-20
  • 打赏
  • 举报
回复
有两类盒子,第一类盒子里装着第二类盒子,第二类盒子里装着第一类盒子 请问,这两个盒子哪个更大? 设计思想的错误,就别往语法上推,再聪明的科学家也解不出“x*0=1,x是优先自然数”这个方程
winux1062 2012-11-20
  • 打赏
  • 举报
回复
引用 9 楼 yisikaipu 的回复:
头文件根本不是问题,问题是不允许这样嵌套定义 C/C++ code?123456789101112131415class B;class A{ B b;}; class B{ A a;}; int main(){ return 0;}
我晕!不好意思,又TM的犯错了, 没有亲自动手, 就胡言乱语!2个文件合一也不行!谢谢!
rocktyt 2012-11-20
  • 打赏
  • 举报
回复
引用 13 楼 WJ_1062 的回复:
请问, 这样的嵌套, 真的没有方法不能解决?
不可以的,这样嵌套会造成无穷递归,A里包含B又包含A,永远没法到头,假设A有一个B以外的int变量,B里就算只有A,这样一圈下来A里面就至少有2个int,再一圈就3个……
winux1062 2012-11-20
  • 打赏
  • 举报
回复
引用 12 楼 phymath 的回复:
没错,换成指针就可以了。 也可以把类的指针定义为自己的成员: C/C++ code?123class A{ A *ptr;};
这确实是一个解决方法, 但是, 貌似和我问的目的不一样, 这样弄, 就修改了我类的定义、、、
加载更多回复(20)

65,176

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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