Policies/Library Code Policy/Shared D-Pointer Example: Difference between revisions

    From KDE TechBase
    No edit summary
    Line 1: Line 1:
    The following example illustrates the [[Policies/Library_Code_Policy#Shared D-Pointer|shared d-pointer]] concept. The class presented here derives from QObject to illustrate parameter-passing in the constructor; it is not necessary to be like that in your code.
    The following example illustrates the [[Policies/Library_Code_Policy#Shared D-Pointers|shared d-pointer]] concept. The class presented here derives from QObject to illustrate parameter-passing in the constructor; it is not necessary to be like that in your code.


    == The header file, without Q_DECLARE_PRIVATE ==
    == The header file, without Q_DECLARE_PRIVATE ==

    Revision as of 12:36, 12 September 2007

    The following example illustrates the shared d-pointer concept. The class presented here derives from QObject to illustrate parameter-passing in the constructor; it is not necessary to be like that in your code.

    The header file, without Q_DECLARE_PRIVATE

    class KFooBasePrivate; class KFooBase : public QObject { public:

       KFooBase(QObject *parent);
       int someInteger() const;
    

    protected:

       KFooBasePrivate * const d_ptr;
       KFooBase(KFooBasePrivate &dd, QObject *parent);
    

    private:

       friend class KFooBasePrivate;
       inline KFooBasePrivate *d_func() { return d_ptr; }
       inline const KFooBasePrivate *d_func() const { return d_ptr; }
    

    };

    class KFooDerivedPrivate; class KFooDerived : public KFooBase { public:

       KFooDerived(QObject *parent);
       int sumOfIntegers() const;
    

    protected:

       KFooDerived(KFooDerivedPrivate &dd, QObject *parent);
    

    private:

       friend class KFooDerivedPrivate;
       inline KFooDerivedPrivate *d_func()
       { return reinterpret_cast<KFooDerivedPrivate *>(d_ptr); }
       inline const KFooDerivedPrivate *d_func() const
       { return reinterpret_cast<KFooDerivedPrivate *>(d_ptr); }
    

    };

    The header file, with Q_DECLARE_PRIVATE

    class KFooBasePrivate; class KFooBase : public QObject { public:

       KFooBase(QObject *parent);
       int someInteger() const;
    

    protected:

       KFooBasePrivate * const d_ptr;
       KFooBase(KFooBasePrivate &dd, QObject *parent);
    

    private:

       Q_DECLARE_PRIVATE(KFooBase)
    

    };

    class KFooDerivedPrivate; class KFooDerived : public KFooBase { public:

       KFooDerived(QObject *parent);
       int sumOfIntegers() const;
    

    protected:

       KFooDerived(KFooDerivedPrivate &dd, QObject *parent);
    

    private:

       Q_DECLARE_PRIVATE(KFooDerived)
    

    };

    The .cpp file

    /*** KFooBase ***/ class KFooBasePrivate { public:

       virtual ~KFooBasePrivate() { }
       int someInteger;
    

    };

    KFooBase::KFooBase(QObject *parent)

       : QObject(parent), d_ptr(new KFooBasePrivate)
    

    { }

    KFooBase::KFooBase(KFooBasePrivate &dd, QObject *parent)

       : QObject(parent), d_ptr(&dd)
    

    { }

    KFooBase::~KFooBase() {

       delete d_ptr;
    

    }

    int KFooBase::someInteger() const {

       Q_D(const KFooBase);
       return d->someInteger;
    

    }

    /*** KFooDerived ***/

    class KFooDerivedPrivate: public KFooBasePrivate { public:

       int anotherInteger;
    

    };

    KFooDerived::KFooDerived(QObject *parent)

       : KFooBase(*new KFooDerivedPrivate, parent)
    

    { }

    KFooDerived::KFooDerived(KFooDerivedPrivate &dd, QObject *parent)

       : KFooBase(dd, parent)
    

    { }

    KFooDerived::~KFooDerived() {

       /* no need to delete the d-pointer! */
    

    }

    int KFooDerived::sumOfIntegers() const {

       Q_D(const KFooDerived);
       return d->someInteger + d->anotherInteger;
    

    }