这种情况多发生在互相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;
}此时就会出现这样的问题

分析这个问题我们可以手动将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;
}
文章讨论了在C++编程中,类A和类B互相包含(循环依赖)引起的问题。当A包含B,B包含A,且业务代码同时包含两者时,会导致编译错误,因为A在使用时还未被声明。解决方案是使用前置声明(classA;)来打破循环依赖,修正后的头文件需包含对方的前置声明,从而确保编译正确。
938

被折叠的 条评论
为什么被折叠?



