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 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. This example puts your d-pointer into {{qt|QScopedPointer}} which will handle proper deleting of the d-pointer once the main object is destroyed. Be sure to delete the d-pointer properly when not using {{qt|QScopedPointer}}, otherwise your d_ptr will leak.

== The header file, without Q_DECLARE_PRIVATE ==

== The header file, without Q_DECLARE_PRIVATE ==

−

<code cppqt>

+

<source lang="cpp-qt">

class KFooBasePrivate;

class KFooBasePrivate;

class KFooBase : public QObject

class KFooBase : public QObject

Line 8:

Line 8:

public:

public:

KFooBase(QObject *parent);

KFooBase(QObject *parent);

+

~KFooBase();

void setSomeInteger(int i);

void setSomeInteger(int i);

int someInteger() const;

int someInteger() const;

protected:

protected:

−

KFooBasePrivate * const d_ptr;

+

const QScopedPointer<KFooBasePrivate> d_ptr;

KFooBase(KFooBasePrivate &dd, QObject *parent);

KFooBase(KFooBasePrivate &dd, QObject *parent);

private:

private:

Line 24:

Line 25:

public:

public:

KFooDerived(QObject *parent);

KFooDerived(QObject *parent);

+

void setAnotherInteger(int i);

+

int anotherInteger() const;

int sumOfIntegers() const;

int sumOfIntegers() const;

protected:

protected:

Line 30:

Line 33:

friend class KFooDerivedPrivate;

friend class KFooDerivedPrivate;

inline KFooDerivedPrivate *d_func()

inline KFooDerivedPrivate *d_func()

−

{ return reinterpret_cast<KFooDerivedPrivate *>(d_ptr); }

+

{ return reinterpret_cast<KFooDerivedPrivate *>(d_ptr.data()); }

inline const KFooDerivedPrivate *d_func() const

inline const KFooDerivedPrivate *d_func() const

−

{ return reinterpret_cast<KFooDerivedPrivate *>(d_ptr); }

+

{ return reinterpret_cast<KFooDerivedPrivate *>(d_ptr.data()); }

};

};

−

</code>

+

</source>

== The header file, with Q_DECLARE_PRIVATE ==

== The header file, with Q_DECLARE_PRIVATE ==

−

<code cppqt>

+

<source lang="cpp-qt">

class KFooBasePrivate;

class KFooBasePrivate;

class KFooBase : public QObject

class KFooBase : public QObject

Line 43:

Line 46:

public:

public:

KFooBase(QObject *parent);

KFooBase(QObject *parent);

+

~KFooBase();

void setSomeInteger(int i);

void setSomeInteger(int i);

int someInteger() const;

int someInteger() const;

protected:

protected:

−

KFooBasePrivate * const d_ptr;

+

const QScopedPointer<KFooBasePrivate> d_ptr;

KFooBase(KFooBasePrivate &dd, QObject *parent);

KFooBase(KFooBasePrivate &dd, QObject *parent);

private:

private:

Line 57:

Line 61:

public:

public:

KFooDerived(QObject *parent);

KFooDerived(QObject *parent);

+

void setAnotherInteger(int i);

+

int anotherInteger() const;

int sumOfIntegers() const;

int sumOfIntegers() const;

protected:

protected:

Line 63:

Line 69:

Q_DECLARE_PRIVATE(KFooDerived)

Q_DECLARE_PRIVATE(KFooDerived)

};

};

−

</code>

+

</source>

== The .cpp file ==

== The .cpp file ==

−

<code cppqt>

+

<source lang="cpp-qt">

/*** KFooBase ***/

/*** KFooBase ***/

class KFooBasePrivate

class KFooBasePrivate

Line 85:

Line 91:

}

}

+

// The destructor must be in the .cpp file, even if empty

KFooBase::~KFooBase()

KFooBase::~KFooBase()

{

{

−

delete d_ptr;

}

}

Line 121:

Line 127:

: KFooBase(dd, parent)

: KFooBase(dd, parent)

{

{

−

}

−

−

KFooDerived::~KFooDerived()

−

{

−

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

}

}

Line 150:

Line 151:

return d->someInteger + d->anotherInteger;

return d->someInteger + d->anotherInteger;

}

}

−

</code>

+

</source>

Latest revision as of 08:14, 7 January 2013

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. This example puts your d-pointer into QScopedPointer which will handle proper deleting of the d-pointer once the main object is destroyed. Be sure to delete the d-pointer properly when not using QScopedPointer, otherwise your d_ptr will leak.