7

我正在更新一些代码,当我在标题中工作时,我遇到了以下行。

.
.
.
class HereIsMyClass;
.
.
.

就是这样。它只是在另一个更长的类定义之前的一行。HereIsMyClass 实际上是其他地方的另一个类,但我不明白为什么要在这里写这行。它有什么作用?

4

4 回答 4

27

C++ 中的这一行是前向声明。它表明在未来的某个时候,可能会存在一个名为 HereIsMyClass 的类。它允许您在完全定义之前在声明中使用类。

它对分解循环依赖的类和头文件管理都有帮助。

例如

class HereIsMyClass;

class Foo { 
  void Bar(HereIsMyClass* p1) ...
};

class HereIsMyClass {
  void Function(Foo f1);
}
于 2009-06-02T14:26:56.327 回答
4

它被称为“前向声明”。这告诉编译器“HereIsMyClass”是类的名称(相对于变量、函数或其他名称)。稍后必须定义该类才能使用它。

当您有需要相互引用的类时,这很有用。

这是一个描述。

于 2009-06-02T14:28:36.590 回答
3

这就是所谓的预先声明。当 HereIsMyClass 的实际声明位于文件的更下方时,或者在文件更下方包含的另一个#include 中时,可能在此行之后有一个使用 HereIsMyClass 的类定义。

如果您没有该行,则该文件可能无法编译。

于 2009-06-02T14:26:57.653 回答
1

这称为“前向声明”,本质上是对稍后定义此类的承诺。具有前向声明允许您声明指针,HereIsMyClass而不必包含它的头文件,但不包含它的实际对象,因为HereIsMyClass编译器仍然不知道对象的大小。


class HereIsMyClass;

class Foo
{
private:
  HereIsMyClass *pointer; // works
  HereIsMYClass object;   // compiler error!
};

前向声明不会告诉编译器类的成员,所以你仍然需要在实际使用它时包含完整的类定义(头文件),即访问它的成员。

于 2009-06-02T14:56:40.837 回答