2013-08-20 38 views
0

我知道它被认为是过时/过时的风格,以便在不需要的地方过度使用指针。但是,我发现这种理想的冲突与避免编译器依赖关系的另一考虑。C++:避免​​编译器依赖与避免指针过度使用

具体来说,我可以在头文件中使用前向声明,并避免#include语句,如果成员变量是指针。但是,这导致我将自己的类的成员变量作为指针,即使没有真正的理由这样做。顺便说一句,我发现使用Qt框架(我喜欢)使我用这种java-esque一揽子编程风格进行编程,因为这是接口的设置方式。

我该如何衡量这两个相互竞争的考虑因素?

+0

你测量过性能吗?堆分配是一个瓶颈吗?如果是这样,你可以只改变热点 – TemplateRex

+1

不要过度去做。第一个目标是一个好的设计,然后是实现。编译器依赖关系只是实现的一个细节。不要为了改善编译时间而打破你的设计,最可能根本就不重要(对于中小型项目) –

+0

我只会使用不在标题中的东西的前向decl,但可以将其限制(作为实现细节)到实现源文件的匿名名称空间。使用前向decl(而不是包含适当的头文件)也只能产生错误和混淆:不要这样做。 – Walter

回答

0

这取决于。减少依赖关系本身就是一件好事,但它必须与所有其他问题进行权衡。例如,使用编译防火墙语言,可以将 依赖关系移出头文件,代价为分配一个 。

至于什么QT的作用:它是一个GUI框架,它(通常是---我 没有看QT)意味着大量的多态性,而且大多数 类是有身份的,不能被复制。在这种情况下,您通常不得不使用动态分配并使用指针 。避免指针的规则主要涉及具有值语义的对象 。

(顺便说一下,没有什么“老式”或 “外的日期”关于使用太多的指针。它已经统治 ,因为我在25年前开始使用C++。)

+1

注意:PIMPL的无执行实现通过在类'pimpl '中保留空间(正确对齐)来工作。在'pimpl'的构造函数中添加一个'static_assert'来确保它足够大,然后在这里。 –

0

Qt需要它,因为它是一个可以动态加载的库。用户可以编译和链接,而不必担心实现细节。您可以在运行时使用许多版本的Qt,而无需重新编译。这非常强大和灵活。如果在类内部使用私有对象实例,这是不可能的。