今天遇到个情况大致可以如下
//file a.h
#include"xxxx.h"//xxxx.h里最终间接的把b.h也包含了
class A{
public:
A(){}
};
//file b.h
#include "a.h"
class B{
public:
B(){}
private:
A a;
}
结果导致编译错误
我们分析a.h对应的a.cpp单元最终可以得到如下代码
//file: a.cpp
//b.h带入的
class B{
public:
B(){}
private:
A a;
}
//a.h带入的
class A{
public:
A(){}
};
//
错误很明显了,解决办法是能用类前向声明的尽量用它来代替#include,好吧将代码改为如下.
//file b.h
class A;
class B{
public:
B(){}
private:
A a;
}
可是还是编译错误,我们知道编译是以cpp为单元来编译的,那么我们来分析b.cpp
假如我们实列化这个类,我们不知道为a分配多大空间,这就是为什么通不过编译。同一系统下所有的指针变量都占有一样大的空间,那么我们改为如下
//file b.h
class A;
class B{
public:
B(){}
private:
A *a;
}
ok了,但是a=new A()时,还是要先知道A的构造,问题又没解决,郁闷…………..
同一文件里要满足如下顺序关系才正确
class A;
class B{
A *a;
public:
B();
};
class A
{
};
B::B(){
a=new A;
}
多个文件在一起很难拼凑出这种顺序啊
看来还是用#include算了,原来我看了一本盗版书,呜呜呜