C ++在类中使用类

时间:2011-10-17 12:40:10

标签: c++

我有一个困扰我的基本问题。

在类中使用类时,我可以在头文件中定义要使用的类的标题。我已经看到了两种方法,并想知道这两种方法之间的区别吗?

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

这两种方法有什么不同?

3 个答案:

答案 0 :(得分:9)

当您包含类定义时,编译器已知classA的comlpete布局。

第二种语法称为前向声明,现在classA是编译器的不完整类型

对于不完整类型,
你可以:

  • 将成员声明为指针或对不完整类型的引用。
  • 声明接受/返回不完整类型的函数或方法。
  • 定义接受/返回指向不完整类型的指针/引用的函数或方法(但不使用其成员)

但你不能:

  • 将其用作基类。
  • 使用它来声明成员。
  • 使用此类型定义函数或方法。
  • 使用其方法或字段,实际上是尝试取消引用不完整类型的变量。

So Forward声明类可能更快,因为编译器不必在该头文件中包含整个代码,但它限制了如何使用该类型,因为它变为不完整类型。

答案 1 :(得分:1)

第二种方法只允许您创建指向ClassA的指针,因为它的大小未知。但是,它可以编译得更快,因为不包括ClassA完整定义的标题。

答案 2 :(得分:0)

后者是前瞻性声明。这样,您可以声明指针或类的引用,即使您尚未完全声明它。这可用于解决循环依赖性。如果在您的第​​一个示例中A也想使用指向B的指针,该怎么办?这不起作用,因为在声明A时,B尚未知晓。要解决这个问题,你可以使用前向声明来告诉编译器有一个类B,稍后你会告诉它它是什么样的。