2015-11-05 97 views
-1

所以我刚刚阅读了各种来源的前向声明(例如谷歌C++风格指南),当我应该和不应该使用前向声明时,我非常困惑。关于前向声明的问题(C++)

一方面,如果我总是转发声明类,我将永远不会有循环依赖和更快的编译时间的麻烦。
但另一方面,我将不得不几乎完全使用指向对象的指针,这些指针看起来相当不安全,并且考虑到内存泄漏并且也不必复杂。

所以我应该使用前向声明,只要我可能或只有当它需要避免像循环依赖的东西?

另一个关于前向声明的问题。如果我正在与GLM(这是一个数学库)等外部库一起工作,并且我需要它在许多不同的类中,有没有办法提前声明那些是/它是否有意义呢?什么,我必须包括(GLM)

例子:

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

再举例来说,我会用这样的:

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

_“......我将不得不几乎完全用指针来对象...”_不!引用也适用于前向声明。 –

回答

1

一般向前声明最终是必要的只有在有某种循环依赖,通常应该避免。

所以说'只为循环依赖'的版本更多的是正确的轨道。

“指向对象的指针”与问题无关,因为在现代C++中,通常原始指针应该避免大部分时间,使用现在标准的智能指针之一,或者更好的引用。根据你想要做什么,使用Pimpl或快速pimpl习惯用法将班级成员排除在课程标题之外也可能是一种好的做法。

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

+0

所以它不值得将每个成员变量改为(智能)指针,所以我可以转发声明,是吗? –

+1

存储和生命周期管理,即特定数据元素是分配到堆栈还是堆,以及是否通过引用,指针,智能指针或特定类中的其他手段访问,通常不应由声明要求驱动在所有。 在大多数情况下避免前向声明。 – kert