专用(隐藏)QSharedData
Private (hidden) QSharedData
我有一个类,它有一些数据成员,我希望对调用方隐藏这些成员(因为包含其类型的头会显著增加编译时间,并且需要每个使用该类的项目向其包含路径添加一个额外的路径)。
此类使用QSharedDataPointer
来存储此数据。通过这种方式,可以使用默认的复制构造函数来复制它。
这个类的基本结构是:
class MyClass {
private:
QSharedDataPointer<MySharedClassData> m_data;
};
如果不在同一个头文件中定义MySharedClassData
(继承自QSharedData
),那么有什么奇特的技巧吗?或者还有其他隐藏数据字段的好方法吗?
我已经尝试过MySharedClassData
的前向声明,但没有成功(尽管m_data
是private
)。
我目前唯一能做的解决方案是将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
是否符合要求,但蒂布尔似乎说符合。
- 这是我尝试让用户将值输入到数组中.然后将其隐藏为大量的星号
- 结构和双指针隐藏在其他结构中,多层混淆
- 在 cpp 文件中隐藏采用模板参数引用的方法
- 参数包构造函数在类模板中隐藏用户定义的转换
- 如何等待窗口隐藏在Qt中?
- 如何使用类型别名从模板化类中隐藏模板列表
- 在设计 SDK 时,我是否应该在 C++ 头文件中完全隐藏内部类?
- 名称隐藏对静态函数继承的实例使用
- 在 Linux 中使用 ioctl() 获取隐藏功能报告时,零字节消失
- 从多个模板化基类派生时出现"隐藏重载的虚函数"警告
- 如何在 Omnet++ 5.6.1 中隐藏箭头?
- 在C++中隐藏键盘记录器的控制台窗口
- 从静态库使用时隐藏不透明结构的内容
- 隐藏用于聚合初始化的空基类
- 使用智能指针指向 C 库中的结构,该结构通过 typedef 隐藏实现(即不完整的类型)
- Qt中的包装连接方法隐藏了编译器所需的信息
- 隐藏重载虚拟功能的模板化访客:SFINAE 在使用?
- 在 ui 文件中隐藏 QTabWidget 中的单个选项卡窗格?
- C++ [错误] 声明'char '隐藏参数。什么意思?
- 专用(隐藏)QSharedData