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

Категории