我有一个困扰我的基本问题。
在类中使用类时,我可以在头文件中定义要使用的类的标题。我已经看到了两种方法,并想知道这两种方法之间的区别吗?
EX1
#include "ClassA.h"
class ClassB {
public:
ClassB();
~ClassB();
ClassA* a;
};
#endif
ex2这是另一种方法。 ClassA标头将在ClassB源文件中定义。
class ClassA;
class ClassB {
public:
ClassB();
~ClassB();
ClassA* a;
};
#endif
这两种方法有什么不同?
答案 0 :(得分:9)
当您包含类定义时,编译器已知classA
的comlpete布局。
第二种语法称为前向声明,现在classA
是编译器的不完整类型。
对于不完整类型,
你可以:
但你不能:
So Forward声明类可能更快,因为编译器不必在该头文件中包含整个代码,但它限制了如何使用该类型,因为它变为不完整类型。
答案 1 :(得分:1)
第二种方法只允许您创建指向ClassA的指针,因为它的大小未知。但是,它可以编译得更快,因为不包括ClassA完整定义的标题。
答案 2 :(得分:0)
后者是前瞻性声明。这样,您可以声明指针或类的引用,即使您尚未完全声明它。这可用于解决循环依赖性。如果在您的第一个示例中A
也想使用指向B
的指针,该怎么办?这不起作用,因为在声明A
时,B
尚未知晓。要解决这个问题,你可以使用前向声明来告诉编译器有一个类B
,稍后你会告诉它它是什么样的。