30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

406 13. Templates<br />

ist für das generelle Konzept e<strong>in</strong>es Buffers nicht wichtig, denn se<strong>in</strong> Verhalten<br />

ändert sich ja nicht, egal ob wir nun <strong>in</strong>t Werte oder char Werte h<strong>in</strong>e<strong>in</strong>stellen<br />

und wieder herausholen wollen.<br />

Nicht nur bei vollständigen Klassen f<strong>in</strong>det man diese Fälle, <strong>in</strong> denen der<br />

Datentyp eigentlich für die Funktionalität nicht so wichtig ist, denselben Fall<br />

gibt es auch bei simplen Funktionen. Nehmen wir e<strong>in</strong>fach nur an, dass es e<strong>in</strong>e<br />

Funktion geben soll, die e<strong>in</strong> Array von Daten sortiert. Egal, welchen tollen<br />

Sortieralgorithmus diese Funktion nun implementiert, e<strong>in</strong>es ist sicher: Solange<br />

der Datentyp, der <strong>in</strong> diesem Array gespeicherten Elemente die Operatoren<br />

>, und < (evtl. auch ==, je nach Algorithmus) und den Zuweisungsoperator<br />

= unterstützt, ist dieses sortierbar.<br />

Genau hier s<strong>in</strong>d wir also beim Pr<strong>in</strong>zip der generischen Programmierung<br />

gelandet: Wir schreiben e<strong>in</strong>e Klasse oder auch e<strong>in</strong>en Algorithmus, ohne <strong>in</strong><br />

der Implementierung auf konkrete Datentypen e<strong>in</strong>zugehen. Stattdessen parametrisieren<br />

wir unsere Implementierung bei deren Verwendung mit diesen<br />

Datentypen um vom generischen Fall zur konkreten Implementation zu kommen.<br />

Im Fall unseres Buffers von zuvor bedeutet das im Pr<strong>in</strong>zip Folgendes:<br />

1. Wir schreiben e<strong>in</strong>e generische Klasse Buffer, die so allgeme<strong>in</strong> formuliert<br />

ist, dass ihr der Datentyp egal ist.<br />

2. Bei Verwendung dieser Klasse wird über e<strong>in</strong>en konkreten Typ-Parameter<br />

(z.B. char) ihr E<strong>in</strong>satzgebiet festgelegt. In diesem Fall hätten wir also<br />

e<strong>in</strong>en Buffer, der nur mit Characters umgehen kann.<br />

Dasselbe passiert im Fall unserer Funktion zum Sortieren e<strong>in</strong>es Arrays. Auch<br />

hier wird der Algorithmus implementiert, ohne auf den echten Typ der zu<br />

sortierenden Elemente Rücksicht zu nehmen. Im speziellen Fall kann diese<br />

Funktion dann entweder e<strong>in</strong> <strong>in</strong>t32-Array, e<strong>in</strong> char-Array oder auch e<strong>in</strong> beliebiges<br />

Objekt-Array sortieren, wenn nur der Datentyp die entsprechenden<br />

Operatoren implementiert.<br />

In C ++ s<strong>in</strong>d die sogenannten Templates der Mechanismus, der es erlaubt,<br />

generische Datentypen zu schreiben und diese dann durch Typ-<br />

Parametrisierung <strong>in</strong> konkreten Varianten zum E<strong>in</strong>satz zu br<strong>in</strong>gen.<br />

Vorsicht Falle: Um e<strong>in</strong>igen Lesern komische Überraschungen zu ersparen<br />

möchte ich gleich e<strong>in</strong>e wichtige Warnung vorwegnehmen: Nicht alle Compiler<br />

können mit allen <strong>in</strong> der Folge vorgestellten Template-Aspekten umgehen. Es<br />

kann also passieren, dass das e<strong>in</strong>e oder andere Testprogrämmchen, das <strong>in</strong> der<br />

Folge vorgestellt wird, nicht compiliert.<br />

Üblicherweise ist es so, dass im Pr<strong>in</strong>zip ke<strong>in</strong> heutzutage verwendeter Compiler<br />

e<strong>in</strong> Problem mit Function Templates (siehe Abschnitt 13.1) und mit<br />

Class Templates (siehe Abschnitt 13.3) hat. So e<strong>in</strong>ige Compiler können allerd<strong>in</strong>gs<br />

gewisse Aspekte der Spezialisierung von Templates nicht (siehe Abschnitt<br />

13.5).

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!