Im folgenden eine Musterlösung zur Aufgabe, Felder beliebigen Typs zu vereinbaren, deren Elementanzahl zur Übersetzungszeit frei ist, aber zur Laufzeit dann konstant.
Die Lösung basiert auf einer template-Klasse mit einem Typparameter und der Anzahl der Elemente.
// Time-stamp: "(12.12.01 21:25) ConstArr.cpp [Klaus Wachtler (aw38)]"
//
//
#include <iostream>
#include <cstdio>
using namespace std;
// Wenn FELDGRENZENPRUEFEN definiert ist, dann wird bei jedem
// Zugriff der Wert des Index geprüft:
#define FELDGRENZENPRUEFEN
template<class T, int N> class Feld
{
public:
// Konstruktor
Feld()
{
}
// Konstruktor mit einem Wert, der anfangs an jedes
// Element zugewisen werden soll:
Feld( const T &Anfangswert )
{
for( int i=0; i<N; i++ )
{
array[i] = Anfangswert;
}
}
// copy-Konstruktor
Feld( const Feld &rechteSeite )
{
for( int i=0; i<N; i++ )
{
array[i] = rechteSeite.array[i];
}
}
// Die Verwendung von [index] liefert eine
// Referenz auf das Element in array[index]:
T &operator[]( int index )
{
#ifdef FELDGRENZENPRUEFEN
if( index<0 || index>=N )
{
static char puffer[200];
sprintf( puffer,
"Feldgrenzenüberschreitung in Feld<class T,int N>:\n"
"%d liegt nicht im Bereich %d...%d-1",
index,
0,
N
);
throw( (const char*)puffer );
}
#endif // ifdef FELDGRENZENPRUEFEN
return array[index];
}
private:
// das eigentliche Feld mit den Elementen
T array[N];
}; // class Feld...
// Testprogramm für Feld<int,10>:
int main( int nargs, char **args )
{
try
{
Feld<int,10> feld(-99);
// Elemente belegen:
for( int i=0; i<5; i++ )
{
feld[i] = i*i;
}
// Elemente ausgeben:
for( int i=0; i<10; i++ )
{
cout << "feld[" << i << "] = " << feld[i] << endl;
}
// "versehentlicher" Zugriff neben das Feld:
cout << "feld[" << 10 << "] = " << feld[10] << endl;
}
catch( const char *Fehler )
{
cerr << "Fehler in main():\n" << Fehler << endl;
}
catch( ... )
{
cerr << "Unbekannter Fehler in main()\n";
}
return 0;
} // main( int nargs, char **args )