============================ Generische Container-Klassen [TOC] ============================ 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 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: ---- CODE (type=cpp) ------------------------------------------------------- #include "array.hpp" int main() { Array 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. :navigate: up -> doc:index next -> doc:session04/page02