QObjects Child Managment
QObject s Child Managment
Example 9.1 shows a QObject derived class.
Example 9.1. src/qobject/person.h
[ . . . . ] class Person : public QObject { public: Person(QObject* parent, QString name); virtual ~Person(); }; [ . . . . ] |
The complete implementation is shown in Example 9.2 to show that there is no explicit object deletion done in ~Person().
Example 9.2. src/qobject/person.cpp
#include "person.h" #include static QTextStream cout(stdout, QIODevice::WriteOnly); Person::Person(QObject* parent, QString name) : QObject(parent) { setObjectName(name); cout << QString("Constructing Person: %1").arg(name) << endl; } Person::~Person() { cout << QString("Destroying Person: %1").arg(objectName()) << endl; } |
main(), shown in Example 9.3, creates some objects, adds them to other objects, and then exits. All heap objects were implicitly destroyed.
Example 9.3. src/qobject/main.cpp
#include #include "person.h" static QTextStream cout(stdout, QIODevice::WriteOnly); int main(int , char**) { cout << "First we create a bunch of objects." << endl; Person bunch(0, "A Stack Object"); <-- 1 /* other objects are created on the heap */ Person *mike = new Person(&bunch, "Mike"); Person *carol = new Person(&bunch, "Carol"); new Person(mike, "Greg"); <-- 2 new Person(mike, "Peter"); new Person(mike, "Bobby"); new Person(carol, "Marcia"); new Person(carol, "Jan"); new Person(carol, "Cindy"); new Person(0, "Alice"); <-- 3 cout << " Display the list using QObject::dumpObjectTree()" << endl; bunch.dumpObjectTree(); cout << " Program finished - destroy all objects." << endl; return 0; } (1)not a pointer (2)We do not need to remember pointers to children, since we can reach them via object navigation. (3)Alice has no parentmemory leak? |
Here is the output of this program:
First we create a bunch of objects. Constructing Person: A Stack Object Constructing Person: Mike Constructing Person: Carol Constructing Person: Greg Constructing Person: Peter Constructing Person: Bobby Constructing Person: Marcia Constructing Person: Jan Constructing Person: Cindy Constructing Person: Alice Display the list using QObject::dumpObjectTree() QObject::A Stack Object QObject::Mike QObject::Greg QObject::Peter QObject::Bobby QObject::Carol QObject::Marcia QObject::Jan QObject::Cindy Program finished - destroy all objects. Destroying Person: A Stack Object Destroying Person: Mike Destroying Person: Greg Destroying Person: Peter Destroying Person: Bobby Destroying Person: Carol Destroying Person: Marcia Destroying Person: Jan Destroying Person: Cindy
Notice that Alice is not part of the dumpObjectTree() and does not get destroyed.
Exercise: QObject's Child Managment
Add the function
void showTree(QObject* theparent)
to main.cpp. The output of this function, after all objects have been created, should look like this:
Member: Mike - Parent: A Stack Object Member: Greg - Parent: Mike Member: Peter - Parent: Mike Member: Bobby - Parent: Mike Member: Carol - Parent: A Stack Object Member: Marcia - Parent: Carol Member: Jan - Parent: Carol Member: Cindy - Parent: Carol
Composite Pattern Parents and Children
|