10

次の Qt クラスを検討してください。

#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(基本的に) を返すだけで、スタックに余分な変数のオーバーヘッドが発生する明示的な関数を使用する理由は何ですか?

4

1 に答える 1