阅读Qt的源代码的时候,我们经常看Q_D、Q_Q、Q_DECLARE_PRIVATE、Q_DECLARE_PUBLIC这几个宏,这几个宏是干什么用的呢?其实这几个宏就是实现D指针和Q指针的宏,D指针在Qt的源码中大量使用,根本目的在于解决二进制兼容问题。至于什么二进制兼容,可以查阅其他资料,这里只讲Qt中是怎么实现的。
1.D指针及Q_指针
我们先建一个Test类和私有类TestPrivate类,在Test类中添加d_ptr成员,在TestPrivate中添加q_ptr成员。头文件如下所示:
#ifndef TEST_H
#define TEST_H
#include <QScopedPointer>
class TestPrivate;
class Test
{
Q_DECLARE_PRIVATE(Test)
public:
Test();
virtual ~Test();
void setValue(int v);
int value() const;
protected:
QScopedPointer<TestPrivate> d_ptr;
};
#endif // TEST_H
源文件如下所示:
#include "test.h"
class TestPrivate
{
Q_DECLARE_PUBLIC(Test)
public:
Test *q_ptr;
int m_value;
};
Test::Test()
: d_ptr(new TestPrivate)
{
d_ptr->q_ptr = this;
d_ptr->m_value = 10;
}
Test::~Test()
{
}
void Test::setValue(int v)
{
Q_D(Test);
if (d->m_value == v) {
return;
}
d->m_value = v;
}
int Test::value() const
{
Q_D(const Test);
return d->m_value;
}
在上面代码中我们使用了Q_D、Q_DECLARE_PRIVATE、Q_DECLARE_PUBLIC宏,这个几个宏如下所示(参看qglobal.h)
template <typename T> static inline T *qGetPtrHelper(T *pt