单线类定义?
Posted
技术标签:
【中文标题】单线类定义?【英文标题】:One line class definition? 【发布时间】:2009-06-02 14:24:24 【问题描述】:我正在更新一些代码,当我在标题中工作时,我遇到了以下行。
.
.
.
class HereIsMyClass;
.
.
.
就是这样。它只是在另一个更长的类定义之前的一行。 HereIsMyClass 实际上是其他地方的另一个类,但我不明白为什么要在这里写这行。它有什么作用?
【问题讨论】:
【参考方案1】:C++ 中的这一行是前向声明。它表明在未来的某个时候,可能会存在一个名为 HereIsMyClass 的类。它允许您在完全定义之前在声明中使用类。
这对于分解循环依赖的类和头文件管理都有帮助。
例如
class HereIsMyClass;
class Foo
void Bar(HereIsMyClass* p1) ...
;
class HereIsMyClass
void Function(Foo f1);
【讨论】:
【参考方案2】:这称为“前向声明”。这告诉编译器“HereIsMyClass”是类的名称(相对于变量、函数或其他名称)。稍后必须定义该类才能使用它。
当您有需要相互引用的类时,这很有用。
Here's 一个描述。
【讨论】:
【参考方案3】:这就是所谓的预声明。当 HereIsMyClass 的实际声明位于文件的更下方时,或者在文件更下方包含的另一个#include 中时,此行之后可能有一个使用 HereIsMyClass 的类定义。
如果您没有该行,则文件可能无法编译。
【讨论】:
我很惊讶:我以为它被称为“前向声明”,但谷歌显示预声明的点击率大约是 10 倍! 我也将其称为“前向声明”。 Google 显示大约 6500 次点击仅用于与德国客户的预先声明,并且第一次点击与编程无关。 说实话,我忘记了“前向声明”这个词,而是使用标准的英文规则来编写预声明。想一想:您在其他地方声明之前声明了某事。这两个术语本质上是可以互换的。如果有人可以在某本书的某处找到该技术的名称(我在 K&R 的索引中找不到前向声明或预先声明),那么在这里注明一下会很酷。 这不是 C 或 C++ 特定的东西。其他语言(pascal)也有这个。所以这个术语不是由 C++ 标准定义的,而是把它当作一个已经定义的东西来使用。【参考方案4】:这称为“前向声明”,本质上是对稍后定义此类的承诺。前向声明允许您声明指向 HereIsMyClass
的指针,而不必包含它的头文件,但不包含它的实际对象,因为编译器仍然不知道 HereIsMyClass
对象的大小。
class HereIsMyClass;
class Foo
private:
HereIsMyClass *pointer; // works
HereIsMYClass object; // compiler error!
;
前向声明不会告诉编译器有关类成员的任何信息,因此您仍然需要在实际使用它时包含完整的类定义(头文件),即。 e.访问其成员。
【讨论】:
以上是关于单线类定义?的主要内容,如果未能解决你的问题,请参考以下文章