您的位置:首页 > 编程语言 > C语言/C++

C++ 两个类头文件互相引用

2017-06-13 21:40 281 查看
    好苦逼 今天被两个 类头文件 整的 欲哭无泪!

    因为定义了两个类,这两个 类 如果互相引用到,然鹅。。我凌乱了,本以为是只要两个都类定义的头文件只要 互相

   包括 include 就搞定了,就没想到 以为 如此简单 ,我弄了一下午,有一点点弄明白了!。

   这里我跟大家分享一下把,也算自己记录一下!。

 

  首先 咱先 来 个死循环压压惊。。一杯咖啡的时间。保证cpu利用率 增赠赠 往上走。

  

  demo一下我之前以为很简单的方法! A B 类示例!

//A.h
#include "B.h"

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

class B
{
A a;
};
很简单把这样 ,,呵呵 循环是挺刺激的。

这样肯定不行啦!

先来说一下我知道。

    如果是 一个类 成员需要包含另一个类的对象,这里是A类 用到 B类。这样先把B的头文件先被A头文件包括,也就是包含了 B类的定义,可以直接定义 一个 B类的 对象,但是。。。。

   B类只能 苦逼 的 声明一个 不完全类型(也就是为定义的类,已有声明)的 A类 的 前向声明。所以不能直接定义

A类的对象实体,只能声明一个指向它(A)的只能,这样不需要什么A的定义。还有就是也可以 声明一个 成员函数

返回是 A ,参数也可以是 A,但是 不能直接 再类内直接定义函数体(因为只认识声明,A类还没定义完),必须要在之后 A类 定义完整之后 才能 在外部定义函数。Ok,不萌比把,不过我说的有点绕,而不粗略,不明吧,请谅解啦!!

    下面请看代码 ,也有说明 !

//A.h
#include "B.h"

class A{
B b; //这样可以直接定义一个类使用,因为包括B的头文件,里面已经定义好了
}

//B.h

class A; //声明一个不完全的类

class B;
{
//如果直接定义A类的对象,则编译器会报错的,因为是一个不完整定义的类
//A a; 错误
//必须 智能声明一个之前A的指针,这样只是一个指针,而不需要知道A 是否定义。
A * a;
/*还有如果定义成员函数的话,用于返回类型、参数类型也是可以,但不能直接在 B类里直接定义函数,
需要在定义完A类的定义 之后才能跟在后面 外部定义函数。*/
A func(A); //这样也是可行的。
//所以 直接声明什么的无所谓,只要不是直接定义一个实体对象出来就可以。
}
然后这样 另外在源文件里 类实现定义函数

//A.cpp
#include "A.h"  //包含A的头文件就行

A::A()
{
....
}
//上面是实现部分 随便
//B.cpp
#include "A.h"  //这里也是只要包含A就行,因为A头文件已经包含了B头文件的定义

B::B()
{
....
}
/*也是定义函数 实现,现在就可以 用到再B头文件里
用到A类返回值或者参数的函数,因为前面有A的include ,已经定义好了A类,所以可以尽情用了!*/


上面的定义函数 实现 都是在 两个类 定义好 之后。

所以 A 类 有完整的B类定义,但B类没有 ,只有一个 前向声明,所有有一定的限制。

只要懂了顺序就好了。这里来排一下。

A类的声明 -> B的定义 -> A 的定义 -> A的实现 -> B的实现。

大概就是这样,我还是要多查阅一下,这样不行,先到这吧。

各位 能看懂就看把,不懂就再看其他的大声的。 笑着哭 ε(┬┬﹏┬┬)3!

再补充一下:另一个大神的话

   两个类不能互相include对方的头文件,两者也不能都是实体对象,必须其中一个为指针。 因为两个类相互引用,不管哪个类在前面,都会出现有一个类未定义的情况,所以可以提前声明一个类,而类的声明就是提前告诉编译器,所要引用的是个类,但此时后面的那个类还没有定义,因此无法给对象分配确定的内存空间,因此只能使用类指针。如果非得互相引用实体,那应该是错误的设计。 
  用指针的原因是:假设两个类分别为A和B,在B中用指针调用A,那么在A需要知道B占空间大小的时候,就会去找到B的定义文件,虽然B的定义文件中并没有导入A的头文件,不知道A的占空间大小,但是由于在B中调用A的时候用的指针形式,B只知道指针占4个字节就可以,不需要知道A真正占空间大小,也就是说,A也是知道B的占空间大小的。 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  文件组织 声明