Generische Container-Klassen
Content |
Generische Container-Klassen haben mindestens einen Typparameter, der den Element-Typ bestimmt. Entsprechend dem Inclusion-Modell sind alle generische Klassen normalerweise in einer Header-Datei unterzubringen, in der alle Methoden vollständig definiert sind, so dass Instantiierungen problemlos vollzogen werden können.
Aufgabe
Beginnen Sie mit einer ganz einfachen Array-Klasse in einer Header-Datei array.hpp mit einem Element-Typ T, bei der die Dimensionierung durch den Konstruktor festgelegt wird. Im einzelnen:
-
Der default constructor sollte ein leeres Array mit einer Dimensionierung von 0 anlegen. Der Zeiger sollte in diesem Fall ein Nullzeiger sein.
-
Wenn die Dimensionierung positiv ist, dann sollten alle Elemente zu Beginn mit dem default constructor angelegt werden. (Dies ist die Voreinstellung bei der Verwendung des new-Operators.)
-
Die rule of three ist zu beachten und über das copy and swap idiom umzusetzen, d.h.
-
kopiert wird nur im Kopierkonstruktor (der hierzu bequemerweise std::copy aus `#include <algorithm> nutzen kann),
-
ausgetauscht wird nur in der mit friend eingebetteten swap-Funktion,
-
so dass der move constructor und der Zuweisungsoperator entsprechend einfach umgesetzt werden können.
-
-
Bieten Sie eine Methode an, mit der die Dimensionierung abgefragt werden kann.
-
Ein Funktionsoperator für den indizierten Zugriff ist hinzuzufügen, sowohl in einer regulären Fassung als auch einer für const-Objekte. Überprüfen Sie die Arraygrenze mit Hilfe von assert.
So etwas sollte also möglich sein:
#include "array.hpp" int main() { Array<int> a(10); a(7) = 42; }
-
Ergänzen Sie dies mit einem kleinen Testprogramm, das ihre Array-Klasse benutzt, um eine zweidimensionale Matrix anzulegen, zu initialisieren und auszugeben. Überprüfen Sie mit valgrind, ob zur Laufzeit alles ordnungsgemäß läuft.
-
Notieren Sie, welche Template-Abhängigkeiten Ihre Container-Klasse hat. Fügen Sie ein weiteres Testprogramm mit einem Beispiel hinzu, bei dem Ihre Container-Klasse mit einem Typ instantiiert wird, der eine der Abhängigkeiten nicht erfüllt und testen Sie, ob dies zu einem Übersetzungsfehler führt. Versuchen Sie genauer herauszufinden, genau wann es zu Übersetzungsfehlern kommt und wann nicht.