博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
两个类相互包含对方成员的问题
阅读量:6595 次
发布时间:2019-06-24

本文共 896 字,大约阅读时间需要 2 分钟。

(源自:)

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

class A
{
    int i;
    B b;
}

class B

{
    int i;
    A* a;
}

请注意上面的定义内容,一般情况下是不能出现类A,类B相互引用都定义对象,即如下的样子:

class A
{
  int i;
  B  b;
}

class B

{
  int i;
  A   a;
}
在这种情况下,想想可以有a.b.a.b.a.b.a.b.a.b…………,很有点子子孙孙无穷尽之状,那么我的机器也无法承受。最主要的还是这种关系很难存在,也很难管理。这种定义方式类同程序中的死循环。所以,一般来说,两者的定义,至少有一方是使用指针,或者两者都使用指针,但是决不能两者都定义实体对象。

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

//class A.h
#include "B.h"
class A
{
  int i;
  B   b;
}

//class B.h

#include "A.h"
class B
{
  int i;
  A *a;
}

如上的包含方式可能会造成编译器有错误提示:A.h文件中使用了示知类型B。

怎么办?
一般的做法是:两个类的头文件之中,选一个包含另一个类的头文件,但另一个头文件中只能采用class *;的申明形式,而在实现文件中(*.cpp)中包含头文件,如下:
//class A.h
#include "B.h"
class A
{
  int i;
  B   b;
}

//class B.h

class A;
class B
{
  int i;
  A *a;
}

//B.cpp

//在B.cpp中的文件包含处要有下面语句,否则不能调用成员a的任何内容
#include "A.h"
B::B()
{
……
}

转载于:https://www.cnblogs.com/kevinGaoblog/archive/2012/04/26/2471844.html

你可能感兴趣的文章
模拟DLL加载
查看>>
[java] DOS编译 .java 文件得到 .class 文件 并执行 以及使用外部 .jar包 时的命令...
查看>>
UESTC 1703 Seven Dices
查看>>
java8:时间与日期
查看>>
==和equals的比较
查看>>
uva10480(最小割)
查看>>
hdu1520(树形dp)
查看>>
Android实现购物车功能
查看>>
url加密和解密
查看>>
bzoj 1150 贪心
查看>>
TensorFlow_CNN_MNIST问题
查看>>
使用process_monitor.sh监控hadoop进程的crontab配置
查看>>
不用选择了,没得选择了
查看>>
ibatis搭建二
查看>>
1.4.2.1. FILES(Core Data 应用程序实践指南)
查看>>
APP IM 之 XMPP和Jabber及选择方案
查看>>
Swift分割字符串
查看>>
linux 常用命令
查看>>
java开发第一天
查看>>
【路由和交换之H3C自导自演】
查看>>