Qt 文档建议将QSharedDataPointer 与其下级的可见实现一起使用是不典型的。
所以根据文档中的小例子,我想出了以下来源(SSCCE)。
接口:Model.h
接口很简单,只是私有类和句柄类的前向声明,声明了copy-ctor和d-tor:
#include <QtCore/QSharedDataPointer>
class ModelPrivate;
class Model {
public:
Model();
Model(const Model &other);
~Model();
QSharedDataPointer<ModelPrivate> d;
};
私有标头:Model_p.h
只需声明并定义低级类。
#include <QSharedData>
class ModelPrivate:
public QSharedData {
public:
};
实现:Model.cc
包含 c-tors/d-tor 的实现,取自文档。
#include "Model.h"
#include "Model_p.h"
class ModelPrivate:
public QSharedData {
};
Model::Model():
d(new ModelPrivate()) {
}
Model::Model(const Model &other):
d(other.d) {
}
Model::~Model() {
}
用例:main.cc
这一切都失败了。
#include <QString>
#include "Model.h"
int main(int argc, char *argv[]) {
QString s1, s2;
s2 = s1;
Model m1, m2;
m2 = m1;
}
只有两个实例和一个作业,就像对任何其他共享类一样。但是,它失败了,因为
invalid use of incomplete type 'class ModelPrivate'
根据文档,我无法弄清楚如何使这项工作以预期的方式工作,即没有在标题中完全声明私有类。我知道这样做会起作用,但我想了解文档。分配共享类的示例也包含在文档中。从上面链接的文档中:
这里并不严格要求复制构造函数,因为 EmployeeData 类与 Employee 类 (employee.h) 包含在同一个文件中。但是,在与包含 QSharedDataPointer 的公共类相同的文件中包含 QSharedData 的私有子类并不典型。通常,这个想法是通过将 QSharedData 的私有子类放在一个不会包含在公共文件中的单独文件中来对用户隐藏它。在这种情况下,我们通常会将 EmployeeData 类放在一个单独的文件中,该文件不会包含在 employee.h 中。相反,我们只需以这种方式在 employee.h 中预先声明私有子类 EmployeeData:
我想operator=
在分配Model
.