我正在更新一些代码,当我在标题中工作时,我遇到了以下行。
.
.
.
class HereIsMyClass;
.
.
.
就是这样。它只是一行,在另一个更长的类定义之前。 HereIsMyClass实际上是其他地方的另一个类,但我不明白为什么这行写在这里。它做了什么?
答案 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。即访问其成员。