C++类的前向声明

今天遇到个情况大致可以如下

//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算了,原来我看了一本盗版书,呜呜呜

猜你喜欢

转载自blog.csdn.net/qq_26046771/article/details/72677123