Pimpl’s, d-pointer’s, cheshire cat’s source code example.
This post is part of this post
.pro file:
TEMPLATE = lib
HEADERS += myclass.h \
myclass_p.h \
myclassderived.h \
myclassderived_p.h
SOURCES += myclass.cpp \
myclassderived.cpp
myclass.h:
#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
class MyClassPrivate;
class MyClass : public QObject
{
Q_OBJECT
public:
explicit MyClass(QObject *parent = 0);
int foo() const;
signals:
void signal(int);
protected:
MyClassPrivate * const d_ptr;
MyClass(MyClassPrivate &dd, QObject * parent);
private:
Q_DECLARE_PRIVATE(MyClass);
};
#endif // MYCLASS_H
myclass_p.h
#ifndef MYCLASS_P_H
#define MYCLASS_P_H
#include "myclass.h"
class MyClassPrivate
{
Q_DECLARE_PUBLIC(MyClass);
public:
MyClassPrivate();
virtual ~MyClassPrivate();
void foo();
int i;
MyClass * q_ptr;
};
#endif // MYCLASS_P_H
myclass.cpp
#include "myclass.h"
#include "myclass_p.h"
MyClassPrivate::MyClassPrivate()
{
i = 5;
}
MyClassPrivate::~MyClassPrivate()
{
//nothing to do
}
void MyClassPrivate::foo()
{
Q_Q(MyClass);
emit(q->signal(i));
}
MyClass::MyClass(QObject *parent)
:QObject(parent)
,d_ptr(new MyClassPrivate())
{
Q_D(MyClass);
d->q_ptr = this;
}
MyClass::MyClass(MyClassPrivate &dd, QObject * parent)
:QObject(parent)
,d_ptr(&dd)
{
Q_D(MyClass);
d->q_ptr = this;
}
int MyClass::foo() const
{
Q_D(const MyClass);
return d->i;
}
myclassderived.h
#ifndef MYCLASSDERIVED_H
#define MYCLASSDERIVED_H
#include "myclass.h"
class MyClassDerivedPrivate;
class MyClassDerived : public MyClass
{
Q_OBJECT
public:
explicit MyClassDerived(QObject *parent = 0);
signals:
void signal2(int);
protected:
MyClassDerived(MyClassDerivedPrivate &dd, QObject * parent);
private:
Q_DECLARE_PRIVATE(MyClassDerived);
};
#endif // MYCLASSDERIVED_H
myclassderived_p.h
#ifndef MYCLASSDERIVED_P_H
#define MYCLASSDERIVED_P_H
#include "myclassderived.h"
#include "myclass_p.h"
class MyClassDerivedPrivate: public MyClassPrivate
{
Q_DECLARE_PUBLIC(MyClassDerived);
public:
MyClassDerivedPrivate();
virtual ~MyClassDerivedPrivate();
void foo2();
int j;
};
#endif // MYCLASSDERIVED_P_H
myclassderived.cpp
#include "myclassderived.h"
#include "myclassderived_p.h"
MyClassDerivedPrivate::MyClassDerivedPrivate()
{
j=6;
i=7;
}
MyClassDerivedPrivate::~MyClassDerivedPrivate()
{
}
void MyClassDerivedPrivate::foo2()
{
Q_Q(MyClassDerived);
emit(q->signal2(j));
emit(q->signal(j));
}
MyClassDerived::MyClassDerived(QObject *parent)
:MyClass(*new MyClassDerivedPrivate(), parent)
{
//Empty
}
MyClassDerived::MyClassDerived(MyClassDerivedPrivate &dd, QObject * parent)
:MyClass(dd, parent)
{
//Empty
}
Unique visitors to post: 37
2 Comments
Post a comment



Very good work, Eugene.
Question: Do you not need to ‘delete’ d_ptr in the MyClass destructor?
Exacltly yes, I forgo about it. But keep in mind that you need to delete it only in base class of hierarhy. I will correct it soon.