C++中两个类相互include的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类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的问题的更多相关文章
- 多态时最好将基类的析构函数设为virtual、 C++中两个类相互包含引用问题 (转载)
多态:http://blog.csdn.net/tmljs1988/article/details/8146521 C++中两个类相互包含引用问题:http://blog.csdn.net/leo11 ...
- c++中两个类相互包含引用的相关问题
在构造自己的类时,可能会遇到两个类相互引用的问题. 例如: class A { int i; B b; }; class B { int i; A a; }; 在这种情况下,这样就会出现一个死循环a. ...
- C++中两个类相互包含引用问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { int i; B b; } class B { in ...
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- Cocos Creator两个类相互引用(调用)
如果两个类相互引用,脚本加载阶段就会出现循环引用,循环引用将导致脚本加载出错:///////////Game.jsvar Item = require("Item");var Ga ...
- 在头文件中声明class 类 与 include类所在的头文件区别---理解
在头文件中声明class 类 与 include类所在的头文件的理解: 在头文件中,声明类 它告诉编译器:存在这样的类.而实际的类则可以位于同一个编译单元中,也可以放在其他编译单元中.没有这个类原型, ...
- 关于node中两个模块相互引用却不会死循环的问题
关于node中两个模块相互引用却不会死循环的问题 node中是通过require来导入加载模块的,require有两个作用: 1.加载文件模块并执行里面的代码 2.拿到被加载文件模块导出的接口对象 现 ...
- c++两个类相互调用
有可能会碰到两个类之间的相互调用的问题,例如:定义了类A和类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; }; class B { A a; }; 编译器在声明A ...
- C++两个类相互包含引用的问题
在构造自己的类时,有可能会碰到两个类之间的相互引用问题,例如:定义了类A类B,A中使用了B定义的类型,B中也使用了A定义的类型 class A { B b; } class B { A* a; } 请 ...
随机推荐
- [HNOI/AHOI2018]寻宝游戏
题目大意: $n(n\le1000)$个$m(m\le5000)$位的二进制数,第$0$个数为$0$.用$\wedge$和$\vee$将这些数连接起来.$q(q\le1000)$次询问,每次给定一个$ ...
- 摄氏度和华氏度之间的额转换 Exercise06_08
/** * @author 冰樱梦 * 时间:2018年下半年 * 题目:摄氏度和华氏度之间的额转换 * */ public class Exercise06_08 { public static v ...
- 【MySQL笔记】mysql报错"ERROR 1206 (HY000): The total number of locks exceeds the lock table size"的解决方法
step1:查看 1.1 Mysql命令行里输入"show engines:"查看innoddb数据引擎状态, 1.2 show variables "%_buffer% ...
- Linux 命令缩写部分解释
转:http://blog.chinaunix.net/uid-28408358-id-3890783.html bin = BINaries /dev = DEVices /etc = ETCe ...
- Nginx用作反向代理服务器
Nginx作为反向代理服务器时转发请求的流程 客户端请求处理 当客户端请求来时,Nginx并不会立刻转发到上游服务器,而是想完整的接收到Nginx所在的服务器, 然后再把缓存的客户端的请求转发到上游服 ...
- JET 调用后端Rest Service
调用Rest Service可以基于两种方式: 一种是oj.Collection.extend 一种是$.ajax CORS问题 但在调用之前,首先需要解决rest service的CORS问题.(跨 ...
- ElasticSearch 获取分词的Token
用ES建好索引,有时候需要获取索引中的Token.ES提供了两个接口,链接如下: https://www.elastic.co/guide/en/elasticsearch/reference/1.6 ...
- 删除Kafka中topic
步骤: 1.编辑Kafka启动时加载的配置文件server.properties,添加一行:delete.topic.enable=true 2.重启Zookeeper和Kafka 3.执行: ./b ...
- jQuery:多个AJAX/JSON请求相应单个回调
原文链接:jQuery: Multiple AJAX and JSON Requests, One Callback 原文日期: 2014年4月15日 翻译日期: 2014年4月22日 翻译人员: 铁 ...
- web应用程序指识别中的指纹收集
web应用程序指纹识别是入侵前的关键步骤,假设通过指纹识别能确定web应用程序的名称及版本号.下一步就可以在网上搜索已公开的漏洞.或网上搜到其源码然后进行白盒的漏洞挖掘. 指纹识别的核心原理是通过正則 ...