所以我刚刚阅读了各种来源的前向声明(例如googles c ++ style guide),当我不应该使用前向声明时,我很困惑。
如果我总是转发声明类,那么我将永远不会遇到循环依赖和更快编译时间的麻烦 但另一方面,我将不得不使用几乎完全使用指向对象的指针,考虑到内存泄漏似乎非常不安全,并且还有不必要的复杂工作。
那么我应该尽可能地使用前向声明,或者只在它需要避免像循环依赖这样的东西时使用前向声明?
关于前瞻性声明的另一个问题。如果我正在使用外部库,如GLM(这是一个数学库),并且我需要它在许多不同的类中有一种方法可以转发声明那些以及它是否有意义这样做?
我必须包含的例子(GLM):
#include <glm.hpp>
#include <gtc/matrix_transform.hpp>
#include <gtc/type_ptr.hpp>
例如,我会像这样使用它:
std::vector <glm::vec3> vertices;
答案 0 :(得分:1)
一般来说,只有在存在某种循环依赖的情况下,前向声明才有必要,并且通常应该避免。
因此,该版本仅针对循环依赖关系&#39;更多的是在正确的轨道上。
&#34;指向对象的指针&#34;并不是真正与这个问题相关,因为在现代C ++中,通常应该在大多数时候避免使用原始指针,而是使用现在标准的智能指针之一,或者更好的是引用。根据你想要做的事情,使用Pimpl或快速pimpl惯用法将类成员保留在类头之外可能也是一个好习惯。
要提出问题的最后部分,您可能要做的是在您自己的单个头文件中包含常用的依赖项外部库头,然后在需要的代码模块中包含此文件。如果您已设置为使用预编译头文件,那么这在编译时也可能具有优势。