查看QT源码,会发现很多类会有一个同样名字、但是以Private结尾的孪生类,这是QT用于封装私有操作的一种设计模式。这种设计模式可以有如下优点:
示例
myclass.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| // myclass.h #ifndef MYCLASS_H #define MYCLASS_H #include <QtCore/QObject> class MyClassPrivate; class MyClass: public QObject { Q_OBJECT public: MyClass(QObject *parent = 0); virtual ~MyClass(); void dummyFunc(); signal: void dummySignal(); private: MyClassPrivate * const d_ptr; Q_DECLARE_PRIVATE(MyClass); Q_DISABLE_COPY(MyClass); }; #endif // MYCLASS_H
|
myclass.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| // myclass.cpp #include "myclass.h" class MyClassPrivate { public: MyClassPrivate(MyClass *parent) : q_ptr(parent) { } void foobar() { Q_Q(MyClass); emit q->dummySignal(); } private: MyClass * const q_ptr; Q_DECLARE_PUBLIC(MyClass); }; MyClass::MyClass(QObject *parent) : QObject(parent) , d_ptr(new MyClassPrivate(this)) { } MyClass::~MyClass() { Q_D(MyClass); delete d; } void MyClass::dummyFunc() { Q_D(MyClass); d->foobar(); }
|
参考链接
- C++学习—qt的公有类、私有类、Q_Q、Q_D、二进制兼容,by 手磨咖啡.
- Qt使用技巧–定义Private类,by 大王怕我去巡山.