============================================================== Vereinfachung der Konstruktoren mit Hilfe von Faktorisierungen [TOC] ============================================================== Bei der letzten Fassung von `array.hpp` fiel auf, dass mehrere Konstruktoren den gleichen Programmtext hatten, um den benötigten Speicher zu belegen. Sie unterschieden sich im Anschluss nur darin, wie die einzelnen Elemente konstruiert werden. In so einer Situation lohnt es sich, den gemeinsamen Teil in einen separaten Konstruktor herauszufaktorisieren und diesen dann von den anderen Konstruktoren verwenden zu lassen. Wir setzen dieses Prinzip bereits beim _move constructor_ entsprechendem _copy and swap idiom_ ein: ---- CODE (type=cpp) ---------------------------------------------------------- Array(Array&& other) : Array() { swap(*this, other); } ------------------------------------------------------------------------------- Hier wird bei der Initialisierung hinter dem Doppelpunkt weder _size_ noch _data_ benannt, stattdessen wird auf den _default constructor_ zurückgegriffen. Wenn wir einen speziellen Konstruktor für das Belegen von Speicher hinzufügen möchten, dann sollten wir zwei Punkte bedenken: * Dieser Konstruktor sollte nicht öffentlich zugänglich sein, da in den weiteren Methoden davon ausgegangen wird, dass alle Elemente des Arrays bereits konstruiert sind. * Obwohl dieser Konstruktur nur die Dimensionierung als Parameter benötigt, muss er sich von dem öffentlichen Konstruktor unterscheiden, der nur die Dimensionierung als Parameter hat. Hier muss also eine künstliche Unterscheidung getroffen werden, etwa durch einen weiteren Parameter. Aufgabe ======= Überlegen Sie sich, wie so ein Konstruktor aussehen könnte und fügen Sie diesen hinzu. Die anderen Konstruktoren, die Speicher anlegen, sollten dann entsprechend vereinfacht werden. Testen Sie wiederum Ihre Lösung mit _valgrind_. Vorlage ======= :import: session04/step02/array.hpp [fold] :navigate: up -> doc:index back -> doc:session04/page04 next -> doc:session04/page06