繁体   English   中英

将指针用于成员类/对象变量是否更好?

[英]Is it better to use pointers for member class/object variables?

当我尝试针对#includes保留干净的头文件时,我发现我可以通过使所有成员指向需要包含其他头文件的类/对象的指针来做得更好,因为这样可以使用前向声明而不是#includes。

但是我开始怀疑这是否是一个很好的经验法则。

因此,以下面的类为例-选项1:

class QAudioDeviceInfo;
class QAudioInput;
class QIODevice;

class QAudioRx
{
public:
    QAudioRx();
private:  
    QAudioDeviceInfo *mp_audioDeviceInfo;
    QAudioInput *mp_audioInput;
    QIODevice *mp_inputDevice;
};

但是,可以这样重写-选项2:

#include "QAudioDeviceInfo.h"
#include "QAudioInput.h"
#include "QIODevice.h"

class QAudioRx
{
public:
    QAudioRx();
private:  
    QAudioDeviceInfo m_audioDeviceInfo;
    QAudioInput m_audioInput;
    QIODevice m_inputDevice;
};

选项1通常是我的首选,因为它包含一个更好的标题。 但是,选项2不需要动态分配/取消分配资源。

也许这可以看作是一个基于主观/观点的问题(而且我知道意见警察将遍及整个问题),所以请避免使用“我喜欢”和“我喜欢”,并坚持事实/要点。

因此,我的问题是,通常,最佳实践是什么(如果有的话),为什么? 或者,如果没有一种最佳实践(通常是这种情况),何时使用每种最佳实践?

编辑

抱歉,这确实是针对私有变量的,而不是公共变量的。

如果需要指针,请使用指针。 指针不是为了避免包含。 包括不是邪恶的。 当您需要使用它们时,请使用它们。 简单的规则等于快乐的编程!

在您的情况下使用指针会带来很多不必要的开销。 可能必须动态分配对象,这对于您的情况不是一个好的选择。 您还必须手动处理内存管理。 简而言之,除非您的情况要求,否则没有理由在此处使用指针(例如,您希望对象比指针本身生存更多(例如,非所有权模式)。

在编译时间和编译时间的依赖关系(通常与所需的包含文件的数量相关)之间需要权衡,并且要兼顾简便性和效率。

选项1编译速度更快,但几乎可以肯定运行速度较慢。 每次访问成员变量时,指针都会间接访问该指针,并且指针所引用的对象必须单独分配和管理。 如果分配是动态的,则将产生额外的成本,并且管理单独对象的附加逻辑可能会引入错误。 首先,您需要使用原始指针,因此您必须定义(或删除)复制构造函数,复制分配以及可能的析构函数,并可能移动构造函数和移动分配(您的示例缺少所有这些,因此可能会严重损坏) 。

选项2需要一些附加的包含,因此当这些标头中的任何一个更改时,使用QAudioRx所有内容都需要重新编译。 这使QAudioRx与其他类型紧密耦合。 在一个可能很重要的大型项目中(但是在一个很小的项目中,这可能并不重要-如果以秒为单位来构建整个项目的时间,那肯定不值得!)

但是我会说您的选择1几乎不是一个好主意。 如果您关心减少依赖关系和构建时间,请改用pImpl惯用语 (有关相关问题,请参阅pimpl ):

class QAudioRx
{
public:
    QAudioRx();

private:  
    class QAudioRxImpl;
    std::unique_ptr<QAudioRxImpl> m_impl;
};

(注意:我对std::unique_ptr<QAudioRx>假定将动态分配impl对象,因为这是最常见的方法,如果对对象进行不同的管理,则可以调整解决方案)。

现在,所有成员变量都是“ impl”对象的一部分,该对象未在标头中定义。 这意味着从impl类内部对成员的访问是直接的,而不是通过指针进行的,但是从QAudioRx进行的访问必须执行一种间接调用才能调用impl类上的函数。

这仍然减少了依赖性,但是由于没有原始指针,因此使额外的复杂性管理起来更加简单,因此特殊成员函数将自动执行明智的操作。 默认情况下,它将是可移动的,但不可复制,并将在析构函数中清除。

当您在班级人数很少的小型项目中工作时,应选择选项2。

但是,当您处理的类非常多的大型项目时,项目的编译时间是开发项目体系结构的标准之一,因此可以选择选项1。

在大多数情况下,选项1很好。 在现实世界的应用程序中,您需要结合使用这两个选项,选择在编译时间和代码漂亮外观之间进行权衡(没有指针,没有为对象添加新的(动态分配)对象。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM