c++时值得向前声明
C++ When worth forward declaration?
我是c++世界的新手,并且了解到向前声明是一种很好的实践。但它总是好的吗?
我正在寻找指导方针,当它是一个很好的做法,使向前声明,当它不是很好,但我真的找不到任何。是否存在使用或不使用它的客观案例,或者这完全取决于开发者?
正如juanchopanza所提到的,一般来说,当您不需要完整的类定义时,可以使用前向声明-基本上是当您不需要知道所讨论的类的大小或成员时。它允许您删除编译时依赖项,这可以简化和加速编译。
例如,如果你只使用指向类的指针,那么你就不需要了解该类的更多信息。但是,如果您调用该类的一个方法,或者存储该类的一个实际实例,那么您需要知道该类的全部细节。
class A; // forward declaration
class B {
...
void func1(A*);
}
class C {
...
A m_inst;
}
在上面的代码中,C
不会编译,因为它需要知道A
在声明时的大小。然而,func1
是好的,因为它只使用指向A
的指针,所以不需要知道大小或实现。
Herb Sutter提供了一些信息和解释,但如果你是初学者,请注意其中一些内容有点高级。
在某些情况下,您实际上开始使用不必要的PIMPL习惯用法应用程序(涉及前向声明)来使代码库复杂化,以减少编译时间,而实际上您首先没有任何编译速度问题,至少对于特定的类或头文件是这样。
这可以被认为是过早优化和滥用前向声明的情况。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- 如果在 2 个线程中使用,是否值得将size_t声明为 std::atomic?
- c++时值得向前声明
- 是否值得声明作为参数传递的数组的(常量)大小