单线类定义?

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.访问其成员。

【讨论】:

以上是关于单线类定义?的主要内容,如果未能解决你的问题,请参考以下文章

什么是BGP

事务脚本-领域模型

Handler消息机制关键类详解

Handler消息机制关键类详解

SPI-SPI单线半双工数据收发应用笔记

使用 Perl 单线就地编辑时使用 begin 块