我一直在阅读有关前瞻性声明的一些内容,包括在本论坛中。他们都说它可以使我们免于包含头文件,但是下面的代码会产生错误:
#ifndef CLASSA_H_
#define CLASSA_H_
class B;
class A {
public:
A();
~A();
int getCount();
private:
static int _count;
int _num;
B _b1; //ERROR
};
编译器说:
A.h:23: error: field ‘_b1’ has incomplete type
我注意到如果我_b1
类型为B*
,问题就解决了。
前向声明只适用于指针类型吗?
如果我希望A
保留B
对象,我必须#inlcude "B.h"
?
谢谢!
答案 0 :(得分:10)
编译器必须知道类B
的确切定义,以确定至少为类A
提供的大小。如果你使用指针,它就知道它的大小。
请注意,循环依赖项是不可能的。如果你想要
class A { B b; };
class B { A a; };
然后A和B必须具有无限大小...
答案 1 :(得分:6)
您可以使用 前向声明类型 来
您需要 类型的完整定义 才能
如果您还记得前向声明实际上是错误的声明(there is no other way of declaring a class type,那么类类型的任何声明都是前向声明),并且,无论何时在class
/ struct
/ union
加上标识符后打开大括号,您都定义类,所有您需要记住的是你:
.
,->
和::
的任何内容) 答案 2 :(得分:0)
是的,你必须
#include "B.h"
如果你想在你的A班中加入B.
答案 3 :(得分:0)
是的,只有在使用指向前向声明类型的指针和引用时,前向声明才有效。如果按值使用对象,则需要包含完整的头文件。