// main.cpp
int main()
{
return 0;
}
// a.h
#pragma once
#include "b.h"
class A
{
B* b;
};
#if 0
// b.h
//错误
#pragma once
#include "a.h"
class B
{
public:
A *c;
};
#endif
#if 0
// b.h
//正确
#pragma once
#include "a.h"
class A;
class B
{
public:
A *c;
};
#endif
#if 1
// b.h
//正确,并且可以不用包含a.h
#pragma once
class A;
class B
{
public:
A *c;
};
#endif
类的前置声明和包含头文件的区别在于类的前置声明是告诉编译器有这种类型,但是它没有告诉编译器这种类型的大小、成员函数和数据成员,而包含头文件则是完全告诉了编译器这种类型到底是怎样的(包括大小和成员)。这下我们也明白了为何前置声明只能使用指针来进行,因为指针大小在编译器是确定的。