C++ Forward 声明一个类?

标签 c++ compiler-construction forward-declaration

在 .h 中,如果我有:

#pragma once

#include <xxxx.h>
#include "yyyy.h"

class AAAAAA;
class BBBBBB;

class ZZZZZZ
{
     public:

     // etc
 };

使用 AAAAAA 类;向前宣布一个类(class)是对的吗?

为什么要这样做?

有必要吗?

有什么好处?缺点?

最佳答案

Why would one do this?

因为编译器只知道已经声明的名称。所以如果你想使用一个类,你必须声明它。但是,如果它的定义取决于它的用户,那么如果用户不依次依赖于类的定义,而只依赖于它的声明(= 名称),则前向声明就足够了。

特别是,如果用户只需要一个指针或引用,则不依赖于定义。但是在列出的情况下(不声称是排他性的,因为它是标准的非规范性摘录),用户取决于类 T 的定义,如果

  • 类型 T 的对象已定义 (3.1),或者
  • T 在 new 表达式(5.3.4)中用作对象类型或数组元素类型,或者
  • 左值到右值的转换应用于引用类型 T (4.1) 对象的左值,或者
  • 表达式被(隐式或显式)转换为类型 T(条款 4、5.2.3、5.2.7、5.2.9、5.4), 或
  • 不是空指针常量且类型不是 void* 的表达式被转换为 使用隐式转换(第 4 条)、dynamic_cast(5.2.7)或 一个 static_cast (5.2.9),或者
  • 类成员访问运算符应用于类型 T (5.2.5) 的表达式,或者
  • typeid 运算符 (5.2.8) 或 sizeof 运算符 (5.3.3) 应用于类型 T 的操作数,或
  • 返回类型或参数类型为 T 的函数被定义 (3.1) 或被调用 (5.2.2),或者
  • 定义了一个具有类型 T 的基类的类(第 10 条),或者
  • 类型 T 的左值被分配给 (5.17),或者
  • 异常声明具有类型 T、对 T 的引用或指向 T 的指针 (15.3)。

在这些情况下,前向声明就足够了,您需要对其进行完整定义。

Is it needed?

是的,在需要的情况下是需要的。在下面的例子中是,因为两个类相互引用。

class A;

class B {
  // forward declaration needed
  void f(A);
};

class A {
  void f(B);
};

// "- a function with a return type or argument type of type T is defined"
void B::f(A) {

}

成员函数定义不仅需要声明,还需要类A的定义。

What are the benefits? Drawbacks?

好处是您的程序可以编译。缺点是您已经用另一个名称污染了作用域。但这是它必要的邪恶。

关于C++ Forward 声明一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3643224/

相关文章:

c++ - 如何在 Windows 上安装 GMP Mp? (C++)

c++ - 错误 :.。 'va_list' 尚未声明

c - Windows 中有等效的 gcc 吗?

c++ - 模板类前向声明

c++ - 设置整个数组值的最简单方法是什么?

c++ - 创建前 n 个整数的 std::set 的最有效方法是什么?

C++ 比较两个字符串文字

c++ - G++ 不使用 -O0 编译我的源代码,但它使用 -O2 -DNDEBUG,我该如何解决?

javascript - Javascript 中不明确的函数声明

c++ - boost::intrusive_ptr 类的前向声明以减少编译时间