这种情况多发生在互相include的情况里,如下:
有两个类,A与B互相包含
#pragma once
#include "A.h"
class B {
public:
A* a;
};
#pragma once
#include "B.h"
class A {
public:
B* b;
};
然后再业务代码同时包含了这两个类
#include "A.h"
#include "B.h"
int main() {
A* a = new A();
B* b = new B();
a->b = b;
b->a = a;
}
此时就会出现这样的问题
![](https://img-blog.csdnimg.cn/img_convert/d942b557d4ccfc0836e025b666911c10.png)
分析这个问题我们可以手动将include展开,或者调整编译器输出预处理后的文件,如下:
class B {
public:
A* a;
};
class A {
public:
B* b;
};
int main() {
A* a = new A();
B* b = new B();
a->b = b;
b->a = a;
}
将改代码进行编译报相同的错误,原因就是line3的A* a,此时还未声明A类。
只要在前端加入A的声明,即可正常运行。
class A;
class B {
public:
A* a;
};
class A {
public:
B* b;
};
int main() {
A* a = new A();
B* b = new B();
a->b = b;
b->a = a;
}
因此,最终应该将两个头文件修改为如下形式,业务代码就可以正常使用了:
#pragma once
#include "B.h"
class B;
class A {
public:
B* b;
};
#pragma once
#include "A.h"
class A;
class B {
public:
A* a;
};
#include "A.h"
#include "B.h"
int main() {
A* a = new A();
B* b = new B();
a->b = b;
b->a = a;
}