标签: qshareddata

我应该将所有数据类实现为QSharedData并将其与QSharedDataPointer一起使用吗?

我是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)

c++ qt4 shared-data qshareddata

5
推荐指数
1
解决办法
2988
查看次数

QSharedData和继承

我正在尝试使用时使用类型系统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)

现在在这个阶段它工作得很好,在调试器中我可以看到正确的指针类型.但现在我想添加一个设置和获取值的函数,我不明白该怎么做.我们以制定者为例.要设置值,我们必须访问 …

c++ qt reference-counting qshareddata

5
推荐指数
2
解决办法
2061
查看次数

带有前向声明类的QSharedDataPointer

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;
};
Run Code Online (Sandbox Code Playgroud)

私有标题:Model_p.h

只需声明并定义劣等类.

#include <QSharedData>
class ModelPrivate:
    public QSharedData {

    public:

};
Run Code Online (Sandbox Code Playgroud)

实施: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() {

}
Run Code Online (Sandbox Code Playgroud)

用例:main.cc

一切都失败了.

#include <QString>
#include "Model.h"

int main(int argc, char *argv[]) {
    QString s1, s2;
    s2 = s1;

    Model …
Run Code Online (Sandbox Code Playgroud)

c++ qt qtcore qshareddata

5
推荐指数
2
解决办法
688
查看次数

私有(隐藏)QSharedData

我有一个类,它有一些我希望从调用者隐藏的数据成员(因为包含其类型的头显着增加了编译时间,并且它需要使用此类的每个项目添加其包含路径的附加路径).

该类用于QSharedDataPointer存储此数据.这样就可以使用默认的复制构造函数进行复制.

这个类的基本结构是:

class MyClass {
private:
  QSharedDataPointer<MySharedClassData> m_data;
};
Run Code Online (Sandbox Code Playgroud)

如果没有在同一个头文件中定义MySharedClassData(继承自QSharedData),是否有任何花哨的技巧?或者还有其他隐藏数据字段的好方法吗?

我已经尝试了前向声明,MySharedClassData但这没有用(尽管事实m_data是这样private).

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

c++ qt private-members qshareddata

3
推荐指数
1
解决办法
796
查看次数

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)

c++ qt multithreading qshareddata

2
推荐指数
1
解决办法
1007
查看次数