不同命名空间的两个类互相调用

两个类互相引用的问题,一般用前置声明解决,但是两个不同命名空间的类就有些复杂了,两个类的头文件和源文件这样写:

类A的头文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace bbb
{
class B;
}

namespace aaa {

class A
{
public:
A();
private:
bbb::B* b;
};
}

类A的源文件
1
2
3
4
5
6
7
8
9
#include "a.h"
#include "b.h"

namespace aaa {
A::A()
{
cout << "A" << endl;
}
}

类B的头文件:

1
2
3
4
5
6
7
8
9
10
11
#include "a.h"

namespace bbb {
class B
{
public:
B();
private:
aaa::A* a;
};
}

类B的源文件

1
2
3
4
5
6
7
8
#include "b.h"

namespace bbb {
B::B()
{
cout << "B" << endl;
}
}

1
2
3
4
5
file.cc:19:69:   required from here
/usr/include/c++/13/ext/aligned_buffer.h:93:28: error: invalid application of ‘sizeof’ to incomplete type ‘aaa::A’
93 | : std::aligned_storage<sizeof(_Tp), __alignof__(_Tp)>
| ^~~~~~~~~~~
/usr/include/c++/13/ext/aligned_buffer.h:93:28: error: invalid application of ‘sizeof’ to incomplete type ‘aaa::A’

解决了带命名空间的两个类互相调用的问题后,编译又出错误。看来是初始化aaa::A时,sizeof计算出错

前置声明告知编译器某个类或者模板的存在,但不提供其完整定义的方式。在初始化前置声明类时,需要分配内存,也就需要使用sizeof,它的计算发生在代码编译时期,此时无法计算,就会报错。解决方法就是在源文件里include前置声明类的头文件,比如这里我们在b.cppinclude "a.h"