我是Qt初学者,需要编写一些数据类.如QSharedDataPointer示例(这里)那样编写所有这些类是一个好方法,还是这个开销过多(除了它更多的工作)?
我的自然课程非常类似于下面的Employee课程.我将不得不处理数百个实例,而不是数万或数百万.
我使用QSharedData/QShareDataPointer的动机是简化手动内存管理并具有通用代码样式.但我仍然不确定是否会监督一些警告.
从示例:
class EmployeeData : public QSharedData
{
public:
EmployeeData();
EmployeeData(const EmployeeData &other);
~EmployeeData();
int id;
QString *name;
};
class Employee
{
public:
Employee();
Employee(int id, const QString &name);
void setId(int id) { d->id = id; }
void setName(const QString &name);
int id() const { return d->id; }
QString name() const;
private:
QSharedDataPointer<EmployeeData> d;
};
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用时使用类型系统QSharedData.这个想法很简单,会有许多不同的数据类型,每个类型都将从基础抽象类派生.我想用它QSharedData来存储每一个中的实际数据,但是每个派生类都会在里面存储不同的数据.我现在正试图做出最基本的例子,并遇到一些麻烦.
假设这些是我的基本纯虚拟类:
class cAbstractData: public QSharedData
{
public:
cAbstractData(){ }
virtual int type() = 0;
};
class cAbstractValue
{
public:
cAbstractValue(){ }
virtual int type() = 0;
protected:
QSharedDataPointer<cAbstractData>data_;
};
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想创建一个表示单个值的类(作为一个简单的例子).我cAtomicValue从基值类派生,我也派生一个数据类来保存值:
class cAtomicData:public cAbstractData
{
public:
cAtomicData() { value_ = 0; }
int type(){ return 1; }
QVariant value_;//the actual value
};
class cAtomicValue:public cAbstractValue
{
public:
cAtomicValue() {
data_ = new cAtomicData;//creating the data object.
}
int type(){ return 1; }
};
Run Code Online (Sandbox Code Playgroud)
现在在这个阶段它工作得很好,在调试器中我可以看到正确的指针类型.但现在我想添加一个设置和获取值的函数,我不明白该怎么做.我们以制定者为例.要设置值,我们必须访问 …
在Qt文档表明,使用QSharedDataPointer一个可见执行其劣势是不典型.
因此,根据文档中的小例子,我提出了以下来源(SSCCE).
接口是直接的,只是私有类和句柄类的前向声明,copy-ctor和d-tor声明:
#include <QtCore/QSharedDataPointer>
class ModelPrivate;
class Model {
public:
Model();
Model(const Model &other);
~Model();
QSharedDataPointer<ModelPrivate> d;
};
Run Code Online (Sandbox Code Playgroud)
只需声明并定义劣等类.
#include <QSharedData>
class ModelPrivate:
public QSharedData {
public:
};
Run Code Online (Sandbox Code Playgroud)
由文档中的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() {
}
Run Code Online (Sandbox Code Playgroud)
一切都失败了.
#include <QString>
#include "Model.h"
int main(int argc, char *argv[]) {
QString s1, s2;
s2 = s1;
Model …Run Code Online (Sandbox Code Playgroud) 我有一个类,它有一些我希望从调用者隐藏的数据成员(因为包含其类型的头显着增加了编译时间,并且它需要使用此类的每个项目添加其包含路径的附加路径).
该类用于QSharedDataPointer存储此数据.这样就可以使用默认的复制构造函数进行复制.
这个类的基本结构是:
class MyClass {
private:
QSharedDataPointer<MySharedClassData> m_data;
};
Run Code Online (Sandbox Code Playgroud)
如果没有在同一个头文件中定义MySharedClassData(继承自QSharedData),是否有任何花哨的技巧?或者还有其他隐藏数据字段的好方法吗?
我已经尝试了前向声明,MySharedClassData但这没有用(尽管事实m_data是这样private).
我目前可以解决的唯一解决方案是声明m_data为,QSharedDataPointer<QSharedData>但是每次我想要访问它时我都需要转换数据成员.有更好的解决方案吗?
我的Qt 5.2.0应用程序中有一个不常见但相当一致的崩溃,我有一段时间的诊断,但相信与之相关QSharedData.该应用程序是高度多线程的,这可能是问题的一部分.
有问题的课程在这里:
class RouteData : public QSharedData
{
public:
RouteData() :
m_destAddress(0),
m_valid(false),
m_movingAverage(ROUTE_INITIAL_QUALITY)
{ }
RouteData(const RouteData &other) :
QSharedData(other),
m_destAddress(other.m_destAddress),
m_addresses(other.m_addresses),
m_valid(other.m_valid),
m_movingAverage(other.m_movingAverage),
m_lastSuccess(other.m_lastSuccess),
m_lastFailure(other.m_lastFailure)
{ }
~RouteData() { }
quint16 m_destAddress;
QList<quint16> m_addresses;
bool m_valid;
double m_movingAverage;
QDateTime m_lastSuccess;
QDateTime m_lastFailure;
};
class Route
{
public:
Route()
{
d = new RouteData;
}
Route(quint16 destAddress)
{
d = new RouteData;
d->m_destAddress = destAddress;
}
Route(const Route &other) : d(other.d) {}
QString toString() const;
bool …Run Code Online (Sandbox Code Playgroud)