KDE TechBase
  • Page
  • Discussion
  • Edit
  • History
KDE TechBase is a Wiki - You can help! Please contribute! Questions?
Please ask development related questions in the KDE Community Forum.

Policies/Library Code Policy/Shared D-Pointer Example

< Policies | Library Code Policy

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.

[edit] The header file, without Q_DECLARE_PRIVATE

class KFooBasePrivate;
class KFooBase : public QObject
{
public:
KFooBase(QObject *parent);
void setSomeInteger(int i);
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);
void setAnotherInteger(int i);
int anotherInteger() const;
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); }
};

[edit] The header file, with Q_DECLARE_PRIVATE

class KFooBasePrivate;
class KFooBase : public QObject
{
public:
KFooBase(QObject *parent);
void setSomeInteger(int i);
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);
void setAnotherInteger(int i);
int anotherInteger() const;
int sumOfIntegers() const;
protected:
KFooDerived(KFooDerivedPrivate &dd, QObject *parent);
private:
Q_DECLARE_PRIVATE(KFooDerived)
};

[edit] 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;
}
 
void KFooBase::setSomeInteger(int i)
{
Q_D(KFooBase);
 
d->someInteger = i;
}
 
int KFooBase::someInteger() const
{
// in const functions add 'const' to the class name
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! */
}
 
void KFooDerived::setAnotherInteger(int i)
{
Q_D(KFooDerived);
 
d->anotherInteger = i;
}
 
int KFooDerived::anotherInteger() const
{
// in const functions add 'const' to the class name
Q_D(const KFooDerived);
 
return d->anotherInteger;
}
 
int KFooDerived::sumOfIntegers() const
{
// in const functions add 'const' to the class name
Q_D(const KFooDerived);
 
return d->someInteger + d->anotherInteger;
}
Retrieved from "http://techbase.kde.org/Policies/Library_Code_Policy/Shared_D-Pointer_Example"

Navigation

  • Home
  • Help
  • Recent changes

Sections

  • Getting started
  • Development
  • Schedules
  • Policies
  • Contribute
  • Projects

Toolbox

  • What links here
  • Related changes
  • Special pages
  • Printable version
  • Permanent link

Personal tools

  • 38.107.191.96
  • Talk for this IP
  • Log in / create account
  • Login with OpenID
Creative Commons License SA 3.0 as well as the GNU Free Documentation License 1.2
KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal