Sie sind hier: Errata  

SEITE 982
 

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.

 




Seite 811