关于正向声明(c++)的问题

Questions about forward declaration (c++)

本文关键字:问题 c++ 于正 声明      更新时间:2023-10-16

所以我刚刚读过各种来源的前向声明(例如谷歌c++风格指南),我很困惑什么时候应该使用前向声明,什么时候不应该使用。

一方面,如果我总是向前声明类,我将永远不会遇到循环依赖关系和更快编译时间的问题
但另一方面,我将不得不几乎完全使用指向对象的指针,考虑到内存泄漏和不必要的复杂操作,这似乎很不安全。

那么,我应该在可能的时候使用正向声明吗?还是只有在需要的时候才使用,以避免循环依赖关系之类的东西?

还有一个关于远期申报的问题。如果我使用外部库,如GLM(这是一个数学库),并且我在许多不同的类中都需要它,那么有没有一种方法可以向前声明这些库/这样做有意义吗?

我必须包括的示例(GLM):

#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>

例如,我会这样使用它:

std::vector <glm::vec3> vertices;

通常,只有在存在某种循环依赖关系的情况下,前向声明才是必要的,并且通常应该避免。

因此,"只针对循环依赖关系"的版本更加正确。

"指向对象的指针"实际上与这个问题无关,因为在现代C++中,通常大多数时候都应该避免使用原始指针,而是使用现在标准的智能指针之一,或者更好的是,使用引用。根据您要做的操作,使用Pimpl或快速Pimpl习惯用法将类成员排除在类头之外可能也是一种很好的做法。

问题的最后一部分,您可能想做的是将您通常使用的依赖外部库头包含在自己的单个头文件中,然后在需要时将该文件包含在代码模块中。如果您已经设置为使用预编译头,那么这在编译时也可能带来优势。