- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
如何在 Qt 中隐藏私有(private)实现(隐式共享):
我的 Employee.h header 中有 Employee.cpp:
#include <QSharedData>
#include <QString>
class EmployeeData;
class Employee: public QObject
{
Q_OBJECT
public:
Employee();
Employee(int id, QString name);
Employee(const Employee &other);
void setId(int id);
void setName(QString name);
int id();
QString name();
private:
QSharedDataPointer<EmployeeData> d;
};
class EmployeeData : public QSharedData
{
public:
EmployeeData() : id(-1) { name.clear(); }
EmployeeData(const EmployeeData &other)
: QSharedData(other), id(other.id), name(other.name) { }
~EmployeeData() { }
int id;
QString name;
};
但是当我将 EmployeeData 移动到私有(private)部分时,比如 Employee.cpp 我得到: 错误:不完整类型“struct EmployeeData”的无效使用
但是,如果我将我的定义更改为这样它就可以正常工作:
class Employee
{
public:
Employee();
Employee(int id, QString name);
..
那么,我可以在继承自 QObject 的同时使用 QSharedData 吗?
最佳答案
Thus, can I use QSharedData while inheriting from QObject ?
使用 QSharedData 时不能从 QObject 继承。 QSharedData 使用 copy-on-write语义并将调用detach()在数据不再共享时创建数据拷贝。为了进行复制,需要一个复制构造函数,QObject 不支持。
pimpl (或 handle-body/opaque-pointer 习语)通常会为数据类提供对公共(public)实现的引用,这就是您使用信号和槽的方式。
QSharedDataPointer提供了大部分的实现细节,但是看一下 Qt 中使用的 pimpl 习语也很有启发性 (see Q_D and friends)
关于c++ - 我可以在继承自 QObject 的同时使用 QSharedData 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2602724/
最近我想实现隐式共享功能,就像 Qt 对其 QSharedData 和 QSharedDataPointer 类所做的那样,所以我查看了它们的源代码并代替了 QSharedData 我找到了这三行:
我正在尝试使用 QSharedData 创建一个类型系统。这个想法很简单,会有许多不同的数据类型,每一种都将派生自基本抽象类。我想使用 QSharedData 将实际数据存储在它们中的每一个中,但是每
在我的 Qt 5.2.0 应用程序中我有一个不常见但相当一致的崩溃,我正在花时间诊断,但相信与 QSharedData 有关.该应用程序是高度多线程的,这可能是问题的一部分。 有问题的类在这里: cl
我有一个类,它有一些我想对调用者隐藏的数据成员(因为包括它们类型的 header 会显着增加编译时间,并且需要每个使用此类的项目添加一个额外的路径到它们的包含路径)。 这个类使用QSharedData
我是一名 Qt 初学者,需要编写一些数据类。像 QSharedDataPointer 示例 ( here ) 那样编写所有这些类是否是一种好方法,或者这是不是开销太大(除了工作量更大这一事实)? 我的
如何在 Qt 中隐藏私有(private)实现(隐式共享): 我的 Employee.h header 中有 Employee.cpp: #include #include class Emplo
我是一名优秀的程序员,十分优秀!