好苦逼 今天被两个 类头文件 整的 欲哭无泪!
因为定义了两个类,这两个 类 如果互相引用到,然鹅。。我凌乱了,本以为是只要两个都类定义的头文件只要 互相
包括 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的占空间大小的。