在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型

例如:

Cup.h

#ifndef CUP_H
#define CUP_H #include "Box.h" class Cup
{
public:
~Cup();
Box b;
Cup();
}; #endif // CUP_H

Cup.cpp

#include "Cup.h"
#include <iostream> using namespace std; Cup::Cup()
{
cout << "Cup cons" << endl;
} Cup::~Cup()
{
cout << "Cup des" << endl;
}

Box.h

#ifndef BOX_H
#define BOX_H #include "Cup.h" class Box
{
public:
Box();
~Box();
Cup cup;
}; #endif // BOX_H

Box.cpp

#include "Box.h"

#include <iostream>

using namespace std;

Box::Box()
{
cout << "Box cons" << endl;
} Box::~Box()
{
cout << "Box des" << endl;
}

在这种情况下,想想可以有b.cup.b.cup.b.....…………,这种定义方式类同程序中的死循环。编译器肯定会报错的。

我的报错信息是

include\Cup.h|10|error: 'Box' does not name a type|

所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

言归正传,那么,在定义时因为相互引用肯定会需要相互包含头文件,如果仅仅只是在各自的头文件中包含对方的头文件,是通不过编译的,如上面的情况所示

解决的办法,让其中一个(例如Cup)只声明对方(class Box;)并且使用指针(Box *b),并且不包含头文件Box.h,在实现文件(Cup.cpp)文件中再包含Box.h,修改后的代码如下:

Cup.h

#ifndef CUP_H
#define CUP_H class Box; class Cup
{
public:
void createBox();
~Cup();
Box *b;
Cup();
}; #endif // CUP_H

Cup.cpp

#include "Cup.h"
#include <iostream> #include "Box.h" using namespace std; Cup::Cup(): b(NULL)
{
cout << "Cup cons" << endl;
} Cup::~Cup()
{
if (b!=NULL) delete b;
cout << "Cup des" << endl;
} void Cup::createBox() {
b = new Box();
}

注意为什么不在Cup::Cup()中直接b = new Box(),因为这是死循环,直接StackOverflow,所以使用了createBox()

最后再写一个main.cpp来测试,可以去尝试解释一下运行结果

#include "Box.h"
#include "Cup.h" #include <iostream> using namespace std; int main() {
Box b;
cout << "something in the middle" << endl;
Cup c;
c.createBox();
}

C++中两个类相互include的问题的更多相关文章

  1. 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)

    多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...

  2. c++中两个类相互包含引用的相关问题

    在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...

  3. C++中两个类相互包含引用问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...

  4. 转载:C++中两个类中互相包含对方对象的指针问题

    原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...

  5. Cocos Creator两个类相互引用(调用)

    如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错:///////////Game.jsvar Item = require("Item");var Ga ...

  6. 在头文件中声明class 类 与 include类所在的头文件区别---理解

    在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...

  7. 关于node中两个模块相互引用却不会死循环的问题

    关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...

  8. c++两个类相互调用

    有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...

  9. C++两个类相互包含引用的问题

    在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...

随机推荐

  1. 【暴力】vijos P1897 学姐吃牛排

    判断堆:递归判断每个节点的孩子是否都比其父亲大(小). 判断BST:中序遍历是否有序. #include<cstdio> using namespace std; #define lc ( ...

  2. python3开发进阶-Django框架中form的查看校验方法is_valid()的源码,自定义验证方法

    form表单的校验方法is_valid() 点开我们发现这个函数里面只有两个方法方法,最终返回True or False 我们点进.is_bound属性,里面判断传输的数据不是空和上传文件不是空 点进 ...

  3. [美团 CodeM 初赛 Round A]数列互质

    题目大意: 给出一个长度为n的数列a1,a2,a3,...,an,以及m组询问(li,ri,ki),求区间[li,ri]中有多少数在该区间中的出现次数与ki互质. 思路: 莫队. f[i]记录数字i出 ...

  4. 【MySQL笔记】: unable to connect to remote host. catalog download has failed.

    安装完MySQL之后,它每天凌晨启动一个Intaller任务,甚是烦人:   这是一个Windows的计划服务,在这里删除即可,开始/附件/系统工具/任务计划程序,把mysql的定时任务计划取消/删除 ...

  5. Ubuntu 16.04下Shell脚本中使用数组提示:Syntax error: "(" unexpected

    说明:这种现象在CentOS中不会出现. 分析: 可以看出sh指向了dash 解决方式: 1.不要用sh执行,使用./test.sh执行.或者bash执行. 2.根治,直接修改sh的指向,改成bash ...

  6. 【java】在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException

    场景: 在分页查询结果中对最后的结果集List进行操作add()或remove()操作,报错:java.lang.UnsupportedOperationException 错误: java.lang ...

  7. ztree jquery 树 控件

    插件地址:http://www.ztree.me 数据:[{"id":1,"pId":-1,"name":"根目录"}, ...

  8. mysql 5.7.20解压版安装配置

    MySql 5.7.20版本免安装版配置过程   下载地址为: https://dev.mysql.com/downloads/mysql/ 最下面根据自己的操作系统选择合适的型号 下载完以后解压缩到 ...

  9. Android修改状态栏颜色全方位教程

    关键字:状态栏着色 透明状态栏 沉浸式 白底黑字 Github Demo:https://github.com/imflyn/Eyes 参考文章: Android-transulcent-status ...

  10. Mac下Git的安装和卸载

    1.安装最新版本:https://git-scm.com/download/mac,下载pkg进行安装 2.卸载:运行/usr/local/git/uninstall.sh