在 .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/