Gefordert ist eine template-Klasse, beispielsweise mit dem Namen VarArr. Diese Klasse soll die automatische Verwaltung von dynamischen Feldern realisieren.
Die Feldgrenzen sollen zur Laufzeit durch Ansprechen von Elementen des Feldes automatisch erweitert werden.
Beispielverwendung:
#include <VarArr.h> ... VarArr<int> intArr; intArr[3] = 33; // Feld hat jetzt nur ein Element [3] intArr[2] = 22; // Feld hat jetzt zwei Elemente ([2], [3]) intArr[-1] = 111; // Feld hat jetzt 5 Elemente ([-1] bis [3]) intArr[0] = 0; intArr[1] = 11; for( int i=-1; i<=3 ) { cout << "Element " << i << " ist " << intArr[i] << endl; }
Mit VarArr<int> intArr;
wird ein Feld von int-Werten
mit dem Namen intArr vereinbart, ohne die gewünschten Feldgrenzen angeben zu
müssen.
Dann kann beliebig auf Elemente des Feldes zugegriffen werden; dabei soll im Hintergrund dafür gesorgt werden, daß die angesprochenen Feldelemente auch existieren.
Des Pudels Kern ist natürlich die geschickte Definition von
operator[]
.
Diese Funktion wird bei jedem Feldzugriff (mit den
Zeichen []
) aufgerufen, und kann bei Bedarf in Ruhe Speicher
nachallokieren,umkopieren, oder was sonst nötig ist, bevor sie eine
Referenz auf das gewünschte Element liefert.
Zu beachtende Randbedingungen:
Beispiele:
SetzeDefault( T &defaultwert )
setzt einen Defaultwert, der in
Zukunft für unbenutzte Elemente verwendet wird. Dies kann sinnvoll
sein, wenn im Feld unbenutzte Lücken vorkommen:
VarArr<char*> strings; strings.setDefault( NULL ); strings[-1] = "abc"; strings[+1] = "def";Hier werden die Elemente
strings[-1]
und strings[+1]
explizit gesetzt; strings[0]
enthält implizit durch den
vorhergehenden Aufruf von SetzeDefault() den Wert NULL.
operator=()
Themen:
Lösung siehe Felder beliebigen Typs mit variablen Grenzen.
AnyWare@Wachtler.de