Programmieren in C++
Kapitel 6: Templates
6.1 Template-Funktionen
Templates dienen dazu, Vorlagen für Funktionen (oder später auch Klassen) zu schreiben,
die für verschiedene Datentypen das gleiche Leisten sollen. Bisher hätte man solche Funktionen
für jeden Datentyp einzeln überladen müssen. Dabei muss aber der Rückgabetyp bei allen Funktionen
gleich sein.
Mit Templates haben wir die Möglichkeit, eine Funktion zu definieren, wobei wir ein oder
mehrere Datentypen durch Platzhalter ersetzen. Der Compiler erkennt anhand des eingesetzten Typs,
wie er den Platzhalter zu ersetzten hat. Man muss aber aufpassen, das beide eingesetzte Typen gleich
sind, weil es sonst zu einer Fehlermeldung kommt. Ich will ein Beispiel zeigen für eine Funktion, die für beliebige zählbare Typen einen Größer- Kleiner- Vergleich durchführt.
Wem die Schreibweise der Funktionsanweisung return (a < b) ? a : b; fremd ist: Hier handelt
es sich um ein Makro, das a mit b auf < vergleicht. Ist die Bedingung erfüllt, wird a zurückgegeben,
ansonsten b.
template <class TYP>
TYP minmax( TYP a, TYP b)
{
return (a < b) ? a : b;
}
void
main()
{
cout << minmax( 1.0, 2.0) << endl;
cout << minmax( 5, 7 ) << endl;
} |
Man beachte, dass das Schlüsselwort class in den Spitzen Klammern nicht darauf hindeutet, das es
sich hier um eine Klasse handelt. Es zeigt lediglich an, dass das nachfolgende Symbol (hier: TYP)
der Platzhalter sein soll. Der Aufruf von minmax( 1, 2.0 ) führt zum Fehler, weil 1 Integer und
2.0 double ist.
6.2 Template-Klassen
Ebenso wie bei Funktionen können wir auch für Klassen Parameter angeben. Dann muss allerdings
bei der Instanzenbildung der gewünschten Typ in spitzen Klammern angegeben werden.
template <class TYP>
class CKlasse
{ // Hier Klassendeklaration festlegen };// Jetzt
folgen die Klassenfunktionsdefinionen
template <class TYP>
TYP CKlasse<TYP>::funktion( int x, TYP& b)
{ . . . }
void main()
{
CKlasse<int> intklass;
. . .
}
|
Wir wollen uns
wieder ein kleines Beispiel anschauen. Es ist nicht ganz einfach, ein Beispiel für diesen Anwendungsfall
zu finden, dass auch zu Lehrzwecken geeignet ist. Ich möchte eine Klasse entwickeln, die als Array für
verschiedene Datentypen dienen soll.
Zugegebener maßen habe ich das Beispiel aus früheren Prüfungsaufgaben abgekuckt. Es war allerdings
nie als Template verlangt. Ich will mal kurz beschreiben, was unsere Klasse können muss. Wer will, kann sich
zunächst selbst dran machen, eine Lösung zu finden, bevor er sich das Beispiel ansieht:
- Es soll eine Vorlagenklasse definiert werden, die ein statisches Feld über beliebige
Datentypen zur Verfügung stellt
- Bei der Konstuktion eines Objektes soll die Größe des Feldes übergeben werden: CArray<int>
feld(10);
- Die Konstruktion eines Arrays aus einem anderen soll möglich sein: CArray<double>
feld2 = feld1
- Mit Hilfe des Indexoperators soll auf einzelne Elemente des Arrays zugegriffen werden:
feld[0]=5; oder feld[2]=feld[2]+2;
- Zwei Arrays sollen ineinander kopiert werden können, wenn sie gleich groß sind:
feld1 = feld2;
- Die Größe des Array soll über eine Funktion GetSize() abgefragt werden können
- Die Daten sind in der Klasse als private zu deklarieren!
Und hier gibts die Lösung zum Download.
|