3

我有一个类,其中包含一些我想对调用者隐藏的数据成员(因为包括其类型的标头会显着增加编译时间,并且它需要使用此类的每个项目都为其包含路径添加额外的路径)。

此类QSharedDataPointer用于存储此数据。这样就可以使用默认的复制构造函数来复制它。

这个类的基本结构是:

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

是否有任何花哨的技巧可以做到这一点而不在同一个头文件中定义MySharedClassData(继承自)?QSharedData或者还有其他隐藏数据字段的好方法吗?

我已经尝试过前向声明,MySharedClassData但这没有用(尽管事实m_dataprivate)。

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

4

3 回答 3

6

只要您的构造函数和析构函数未在标头中定义,前向声明就应该起作用。以下类在我的计算机上编译:

#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

如果您尝试内联构造函数/析构函数,那么您可能会C2027: use of undefined type 'type'在 VS 下收到:

于 2012-02-07T12:35:48.947 回答
0

是的。不需要真正花哨的技巧。但是,所有确实需要的方法都MySharedClassData必须在定义之后定义MySharedClassData。如果将类定义移动到 .cpp 文件,则方法也必须移动到那里。

于 2012-02-07T12:38:11.980 回答
0

一般来说,如果你想使用带有指向前向声明的 impl 的智能指针的 pimpl 习惯用法(而不是手动管理 impl 对象),你需要一个带有外线删除器的智能指针,比如boost::shared_ptr(你应该是能够std::unique_ptr与自定义删除器一起使用,但我没有尝试过)。

要求是您可以在不看到 impl 类析构函数的情况下实例化智能指针模板:例如,这排除std::auto_ptr了。

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

于 2012-02-07T12:40:36.560 回答