专用(隐藏)QSharedData

Private (hidden) QSharedData

本文关键字:QSharedData 隐藏 专用      更新时间:2023-10-16

我有一个类,它有一些数据成员,我希望对调用方隐藏这些成员(因为包含其类型的头会显著增加编译时间,并且需要每个使用该类的项目向其包含路径添加一个额外的路径)。

此类使用QSharedDataPointer来存储此数据。通过这种方式,可以使用默认的复制构造函数来复制它。

这个类的基本结构是:

class MyClass {
private:
  QSharedDataPointer<MySharedClassData> m_data;
};

如果不在同一个头文件中定义MySharedClassData(继承自QSharedData),那么有什么奇特的技巧吗?或者还有其他隐藏数据字段的好方法吗?

我已经尝试过MySharedClassData的前向声明,但没有成功(尽管m_dataprivate)。

我目前唯一能做的解决方案是将m_data声明为QSharedDataPointer<QSharedData>,但每次我想访问它时都需要强制转换数据成员。有更好的解决方案吗?

只要没有在头中定义构造函数和析构函数,正向声明就应该有效。以下类在我的计算机上编译:

#ifndef MAIN_WINDOW_HXX
#define MAIN_WINDOW_HXX
#include <QMainWindow>
#include <ui_MainWindow.h>
#include <QSharedDataPointer>
class MySharedClassData;
class MainWindow : public QMainWindow, private Ui_MainWindow {
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0, Qt::WindowFlags flags = 0);
    virtual ~MainWindow();
    QSharedDataPointer<MySharedClassData> m_data;
};
#endif

如果您尝试内联构造函数/析构函数,那么您可能会在VS.

下收到一个:C2027: use of undefined type 'type'

是。不需要什么特别的把戏。但是,确实需要MySharedClassData的所有方法都必须在定义MySharedClassData之后定义。如果将类定义移动到.cpp文件,则方法也必须移动到那里。

通常,如果您想将pimpl习惯用法与指向前向声明的impl的智能指针一起使用(而不是手动管理impl对象),您需要一个带有越界deleter的智能指针,如boost::shared_ptr(您应该能够将std::unique_ptr与自定义deleter一起使用,但我还没有尝试过)。

要求是可以实例化智能指针模板,而不需要看到impl类析构函数:例如,这就排除了std::auto_ptr

我不知道QSharedDataPointer是否符合要求,但蒂布尔似乎说符合。