Originaltext:
//-------------------------------------------------------------------
// op []
//
template<typename T, int N>
T& FixedArray<T,N>::operator [] ( int aIndex )
{
if ( aIndex < 0 ||
aIndex >= N )
{
FixedArrayIndexError e;
e.mAktIndex =
aIndex;
e.mMaxIndex = N;
throw e;
}
return mWert[ aIndex ];
} // op []
Korrekt muss es heißen:
//-------------------------------------------------------------------
// op []
//
template<typename T, int N>
T& FixedArray<T,N>::operator [] ( int aIndex )
{
if ( aIndex < 0 ||
aIndex >= N )
{
FixedArrayIndexError e;
e.mAktIndex =
aIndex;
e.mMaxIndex = N-1;
throw e;
}
return mWert[ aIndex ];
} // op []
Anmerkungen:
Ein kleines Problem, das im Buch nicht behandelt wird, ist die
Abfrage auf ungültige Instanziierungen. Schreibt man z.B.
FixedArray<int,0> fa;
führt dies zwar beim ersten Zugriff zum Werfen der Ausnahme FixedArrayIndexError, das Problem
liegt jedoch bereits in der Instanziierung mit der (ungültigen) Feldgröße 0.
Man könnte die Korrektheit für N zwar bei jedem Zugriff abfragen, dies beeinträchtigt
jedoch die Laufzeit und ist in der Praxis unnötig.
Es gibt fortgeschrittene Techniken im Zusammenhang mit Schablonen,
die es erlauben, die Korrektheit von N (also im Wesentlichen einen Wert größer
0) zur Übersetzungszeit zu prüfen. Die Anweisung
FixedArray<int,0> fa;
// produziert Übersetzungsfehler!
führt dann zu einem Fehler bei der Übersetzung, wohingegen
FixedArray<int,0> fa;
// OK
korrekt übersetzt wird.
Ich hoffe, diese Technik in der Fortgeschrittenen
Kunst der Programmierung mit C++ vorstellen zu können. Derzeit funktioniert
sie nicht mit den üblichen Compilern.