Seite 1 von 1

Copy and Move assignment operator für TreeItem

Verfasst: 27. August 2015 13:35
von ralfwickum
Hallo,

ich habe folgendes Beispiel zur Übung nachimplemetiert: http://doc.qt.io/qt-5/qtwidgets-itemvie ... ample.html

Da http://doc.qt.io/qt-5/qtwidgets-itemvie ... m-cpp.html und http://doc.qt.io/qt-5/qtwidgets-itemvie ... tem-h.html nicht Rule-Of-Five konform sind, möchte ich zur Übung diese dort einbauen.

Vorab: Klasse TreeItem hat folgende Memebervariablen:

Code: Alles auswählen

    QList<TreeItem*> childItems;
    QVector<QVariant> itemData;
    TreeItem *parentItem;
1. Da dort nur die Memebervariable parentItem ein Pointer ist, bringen mir die Vorteile der Move Semantics auch nur dort etwas?
2. QVector<QVariant> itemData ist weder ein Pointer, noch beinhaltet es Pointer, dort habei ch überhaupt keine Vorteile, richtig?
3. QList<TreeItem*> childItems ist selbst zwar auch kein Pointer, aber die Containerelemente sind Pointer. Hätte ich dort Nutzen durch Move Semantics?
4. Wenn ich mit 3. und 4. richtig liege, kann ich Move Semantics ausschöfpen wenn ich alle Membervariablen in Pointer umwandle?

Code: Alles auswählen

    QList<TreeItem*> * childItems;
    QVector<QVariant> * itemData;
    TreeItem *parentItem;
Danke schonmal für alle Aufklärenden und Konstruktiven Hinweisgebern.
VG Ralf

Re: Copy and Move assignment operator für TreeItem

Verfasst: 28. August 2015 06:36
von Christian81
Die C++11 - Move-Semantik (in einem Objekt) nützt Dir bei Pointern auf Objekte gar nichts da ja keine Daten sondern nur die Pointer auf die Daten kopiert/verschoben werden. Maximal beim kopieren einer Objektliste (in einem Container wie Q/std::vector) hilft Dir ggf. die Move-Semantik ein memcpy() der Pointer zu vermeiden.
Und da das TreeItem eigentlich immer als Pointer zu verwenden ist (schon allein um eine sinnvolle Parent - Child -Beziehung aufbauen zu können) ist hier der Move ctor etc. absolut irrelevant.

Re: Copy and Move assignment operator für TreeItem

Verfasst: 28. August 2015 08:36
von RHBaum
Generell, "Rule-Of-Five" und ähnliche Regeln, betreffen meistens "ideale" Objekte.
Ideal aus C++ Sicht, was meist bedeutet ... frei von Abhängigkeiten und Nebenwirkungen.

Das sind Objekte mit Parent Child beziehungen etc eben nicht.
z.b. der CCTor Class::class(const class & rx);
Bei einem Item in einem Baum, was erwartest du dann vom Verhalten dieses CCtors ?
Ist der wirklich nebenwirkungsfrei ...
Macht er auch wirklich Sinn ?
Was nützt dir nen CTor, wo du hinterher noch nacharbeiten musst, bzw. sogar noch andere betroffene Objekte ändern musst ?
Ähnlich siehts mit der Anwendbarkeit der "rules of Three" bzw five auch aus.

BTW: nicht umsonst heissts immer das grad GUI Frameworks "mieses" C++ Design haben.
ein Grund ist halt, das die meisten GUI Objecte ne Beziehung zu ner HW Ressource haben, die wiederum mit anderen Ressourcen in Verbindung stehen.
Somit GUI Objekte kaum "ideale" C++ Objekte abgeben .....

Ciao ....