两个类互相引用的问题,一般用前置声明解决,但是两个不同命名空间的类就有些复杂了,两个类的头文件和源文件这样写:
类A的头文件:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15namespace bbb
{
class B;
}
namespace aaa {
class A
{
public:
A();
private:
bbb::B* b;
};
}
类A的源文件1
2
3
4
5
6
7
8
9
namespace aaa {
A::A()
{
cout << "A" << endl;
}
}
类B的头文件:1
2
3
4
5
6
7
8
9
10
11
namespace bbb {
class B
{
public:
B();
private:
aaa::A* a;
};
}
类B的源文件1
2
3
4
5
6
7
8
namespace bbb {
B::B()
{
cout << "B" << endl;
}
}
1 | file.cc:19:69: required from here |
解决了带命名空间的两个类互相调用的问题后,编译又出错误。看来是初始化aaa::A
时,sizeof
计算出错
前置声明告知编译器某个类或者模板的存在,但不提供其完整定义的方式。在初始化前置声明类时,需要分配内存,也就需要使用sizeof
,它的计算发生在代码编译时期,此时无法计算,就会报错。解决方法就是在源文件里include前置声明类的头文件,比如这里我们在b.cpp
里include "a.h"