前置声明主要用于类与类之间的循环引用,且只是针对类指针或者引用有效,对完整的类字段无效。如下代码所示:
#include <iostream>
using namespace std;
class B;
class C;
class A
{
public:
B *b;
C c; ///< 错误写法
C* c1; ///< 正确写法
C& c2; ///< 正确写法
};
class B
{
public:
A *a;
C c; ///< 错误写法
C* c1; ///< 正确写法
C& c2; ///< 正确写法
};
class C
{
public:
A *a;
B *b;
};
int main()
{
return 0;
}
编译时报错如下:
提示类C是个不完整的类型,将其改为C*c即可通过编译。
另外需要注意的是当typedef定义的别名需要前置声明时,需要按照如下的方式进行声明,而不能直接写成? ?class 类别名? ?的形式。如下所示:
#include <iostream>
using namespace std;
typedef class B B_t; ///< 正确写法
typedef C_t; ///< 错误写法
// typedef class C C_t; ///< 正确写法
class A
{
public:
B_t *b;
C_t *c;
};
typedef class B
{
public:
} B_t;
typedef class C{
}C_t;
int main()
{
return 0;
}
上述代码编译时报错: