9
考慮下面的Qt類:爲什麼Qt使用d_func()來實例化指向私有數據的指針?
#include <QScopedPointer>
class MyClassPrivate;
class MyClass
{
public:
MyClass();
~MyClass();
private:
QScopedPointer<MyClassPrivate> d_ptr;
Q_DECLARE_PRIVATE(MyClass)
}
該類類似於實現私有實現大多數Qt類的結構。宏Q_DECLARE_PRIVATE
將導致以下膨脹(如QT5的):
inline MyClassPrivate* d_func()
{ return reinterpret_cast<MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
inline const MyClassPrivate* d_func() const
{ return reinterpret_cast<const MyClassPrivate *>(qGetPtrHelper(d_ptr)); }
friend class MyClassPrivate;
這是混亂 - 爲什麼不d_ptr
在成員函數直接使用?換句話說,而不是這樣做:
Q_D(MyClass);
d->member = 12345;
爲什麼不這樣做呢?
d_ptr->member = 12345;
什麼是對具有明確的功能(基本上)僅返回d_ptr
,並會導致堆棧上的額外變量的開銷的原因嗎?
如果我的類沒有一個是相互繼承的,那麼使用'Q_DECLARE_PRIVATE'宏有什麼好處呢?繼承是內聯方法的唯一原因嗎? – 2013-04-10 04:44:38
@NathanOsman我認爲應該沒有理由使用宏,如果你使用兩個不相互繼承的類。他們每個人都可以有一個單獨的實施。但事實是,在Qt中,幾乎所有的類都是從QObject類繼承而來的,並且有時繼承會非常深刻,如果沒有這樣的機制,它會給內存帶來很大的開銷。 – 2013-04-10 04:54:25