一线定义?

时间:2009-06-02 14:24:24

标签: c++ class definition

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

.
.
.
class HereIsMyClass;
.
.
.

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

4 个答案:

答案 0 :(得分:27)

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

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

例如

class HereIsMyClass;

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

class HereIsMyClass {
  void Function(Foo f1);
}

答案 1 :(得分:4)

它被称为“前瞻性声明”。这告诉编译器'HereIsMyClass'是类的名称(与变量名,函数名或其他名称相对)。该类必须在以后定义才能使用。

当您拥有需要相互引用的类时,这非常有用。

Here's一个描述。

答案 2 :(得分:3)

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

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

答案 3 :(得分:1)

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


class HereIsMyClass;

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

前向声明告诉编译器没有关于类成员的信息,所以你仍然需要在实际使用时包含完整的类定义(头文件),i。即访问其成员。