如果我在不同的标题中有两个类:
第一个标题:
include "second_header.h"
class A
{
int x;
};
和第二个:
include "first_header.h"
class A;
class B
{
A a;
};
为什么编译器会给我一个未定义类的错误,我可以解释一下吗?
答案 0 :(得分:4)
因为在second_header.h
中,A
类实际上未定义 ,只有声明了。要使用类的非引用/非指针,需要对其进行完全定义。
由于您不需要second_header.h
中的first_header.h
文件,只需从first_header.h
文件中删除该包含。
答案 1 :(得分:3)
您要求编译器递归地包含标头。您不需要在第一个标头中包含第二个标头,请尝试删除包含。
顺便说一下,你应该总是在C ++标题中使用include guards。
答案 2 :(得分:1)
如果您实际使用A类对象,则不能使用A的前向声明。
您应该从第二个标题中移除class A;
行,或者
您可以在B类中使用指针:
class A; // forward declaration, no need to include A's header.
class B
{
A* a; // don't create an A object (compiler would need A's header) but an A pointer.
};