✨博客主页 | ||
---|---|---|
何曾参静谧的博客 | ||
📌文章专栏 | ||
「QT」QT5程序设计 | ||
📚全部专栏 | ||
「Win」Windows程序设计 | 「IDE」集成开发环境 | 「UG/NX」BlockUI集合 |
「C/C++」C/C++程序设计 | 「DSA」数据结构与算法 | 「UG/NX」NX二次开发 |
「QT」QT5程序设计 | 「File」数据文件格式 | 「UG/NX」NX定制开发 |
「Py」Python程序设计 | 「Math」探秘数学世界 | 「PK」Parasolid函数说明 |
目录
- Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解
- 一、d-pointer的基本用法
- 二、QSharedDataPointer的用法
- 三、d-func()和const d-func()的使用
- 四、总结
Qt中的d-pointer(d-指针)与QSharedDataPointer用法详解
在Qt框架中,d-pointer(d-指针)是一种常用的设计模式,用于隐藏类的实现细节,提高代码的可维护性和封装性。d-pointer通常与Pimpl(Pointer to IMPLementation)惯用法相结合,通过将类的实现细节封装在一个私有或受保护的类中,并在头文件中仅暴露一个指向该私有类的指针,从而减少了头文件的依赖和编译时间。
在Qt中,QSharedDataPointer
是一个特殊的智能指针,用于管理实现了QSharedData
接口的类的数据。这种智能指针允许数据在多个对象之间共享,同时确保数据的正确删除和内存管理。当最后一个使用数据的对象被销毁时,数据也会被自动删除。
下面,我们将详细探讨QFileInfo
类(假设其内部使用了d-pointer和QSharedDataPointer
)中这些技术的用法。
一、d-pointer的基本用法
在Qt中,d-pointer通常定义为一个私有或受保护的成员变量,指向一个包含类实现细节的私有类。这个私有类通常被称为“d类”或“实现类”。
// QFileInfo.h
class QFileInfoPrivate; // 前向声明私有类
class QFileInfo {
protected:
QSharedDataPointer<QFileInfoPrivate> d_ptr; // d-pointer,使用QSharedDataPointer管理
public:
// ... 类的公共接口 ...
private:
// 声明d-func()和const d-func()成员函数,用于访问d-pointer
QFileInfoPrivate* d_func();
inline const QFileInfoPrivate* d_func() const {
return d_ptr.constData(); // 返回d-pointer指向的const数据
}
// ... 类的私有接口和成员 ...
};
在上面的代码中,QFileInfo
类包含一个受保护的QSharedDataPointer<QFileInfoPrivate>
成员变量d_ptr
。这个指针指向QFileInfoPrivate
类的实例,后者包含了QFileInfo
类的所有实现细节。
二、QSharedDataPointer的用法
QSharedDataPointer
是Qt提供的一个模板类,用于管理实现了QSharedData
接口的类的实例。当多个QFileInfo
对象共享相同的QFileInfoPrivate
数据时,QSharedDataPointer
可以确保这些数据只被存储一次,并在所有引用它的对象被销毁时自动删除。
// QFileInfoPrivate.h
#include <QSharedData>
class QFileInfoPrivate : public QSharedData {
public:
// ... 类的成员变量和成员函数 ...
// 例如,可能包含文件路径、大小、权限等信息
QString filePath;
qint64 fileSize;
// ... 其他成员 ...
};
在QFileInfoPrivate
类中,我们继承自QSharedData
,这使得我们可以使用QSharedDataPointer
来管理它的实例。
三、d-func()和const d-func()的使用
为了访问d-pointer指向的私有类实例,QFileInfo
类提供了d_func()
和const d_func()
成员函数。这些函数返回指向QFileInfoPrivate
实例的指针或const指针,允许在类的非const成员函数和const成员函数中分别访问和修改私有数据。
// QFileInfo.cpp
#include "QFileInfo.h"
#include "QFileInfoPrivate.h"
// 实现d-func()
QFileInfoPrivate* QFileInfo::d_func() {
return reinterpret_cast<QFileInfoPrivate*>(d_ptr.data()); // 转换为正确的类型
}
// ... 其他QFileInfo成员函数的实现 ...
// 例如,一个获取文件路径的函数
QString QFileInfo::filePath() const {
Q_D(const QFileInfo); // 使用Q_D宏简化d-pointer的访问
return d->filePath; // 访问私有数据
}
在上面的代码中,我们使用了Q_D
宏来简化对d-pointer的访问。这个宏在Qt中定义,用于声明一个名为d
的局部变量,并将其初始化为调用d_func()
的结果。这样,我们就可以在函数体内使用d
来访问私有数据了。
四、总结
通过使用d-pointer和QSharedDataPointer
,Qt类可以在保持接口稳定的同时,灵活地修改其内部实现。这种技术减少了头文件的依赖,提高了编译速度,并允许类的私有数据在多个对象之间安全地共享。在Qt框架中,这种设计模式被广泛采用,是Qt代码库中的一个重要组成部分。