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.

13.7 Source Code Organisation 447<br />

Dass e<strong>in</strong> Konstruieren von e<strong>in</strong>er anderen Ausprägung von ComplexNumber<br />

nur möglich ist, wenn Real- und Imag<strong>in</strong>ärteil zue<strong>in</strong>ander kompatibel s<strong>in</strong>d,<br />

ist durch die Initialisierung der Members <strong>in</strong> den Zeilen 40–41 sichergestellt.<br />

Sollten diese nicht kompatibel se<strong>in</strong>, dann beschwert sich natürlich sofort der<br />

Compiler.<br />

Auffällig an diesem Beispiel ist jedoch der extra implementierte Copy-<br />

Constructor <strong>in</strong> den Zeilen 31–36. Wozu brauchen wir diesen, wo doch bereits<br />

e<strong>in</strong> Template existiert, von dem e<strong>in</strong>e konkrete Ausprägung der Copy-<br />

Constructor se<strong>in</strong> könnte? Die Antwort ist e<strong>in</strong>fach: Der Copy-Constructor ist<br />

für den Compiler etwas ganz Besonderes und er denkt nicht im Traum daran,<br />

diesen aus dem Template zu erzeugen. Entweder er existiert explizit, so wie<br />

hier, oder er wird vom Compiler implizit nach se<strong>in</strong>en eigenen Regeln erzeugt.<br />

13.7 Source Code Organisation<br />

Bisher war immer davon die Rede, dass der Compiler nur dann den Code für<br />

e<strong>in</strong>e konkrete Ausprägung e<strong>in</strong>es Templates generieren kann, wenn er ihn auch<br />

vollständig sieht. Deshalb waren Deklaration und Def<strong>in</strong>ition aller Templates<br />

bisher immer vollständig <strong>in</strong> unseren Header Files enthalten. Schöner wäre<br />

es allerd<strong>in</strong>gs, wenn wir wieder zu unserer guten alten Methode greifen und<br />

die Deklarationen <strong>in</strong> e<strong>in</strong>en Header, die Def<strong>in</strong>itionen jedoch <strong>in</strong> e<strong>in</strong> cpp File<br />

schreiben könnten.<br />

E<strong>in</strong>en weiteren Aspekt gibt es noch, der bei Templates zu beachten ist:<br />

Der Scope des Compilers ist immer auf e<strong>in</strong>e e<strong>in</strong>zige sogenannte Compilation<br />

Unit beschränkt, also salopp gesprochen auf e<strong>in</strong> cpp File. Das bedeutet<br />

bei der Verwendung von Templates Folgendes: Wenn e<strong>in</strong> Header mit Template<br />

Deklarationen und Def<strong>in</strong>itionen <strong>in</strong> mehreren Files <strong>in</strong>kludiert ist, dann<br />

erzeugt der Compiler bei jedem e<strong>in</strong>zelnen File, das er getrennt übersetzt, alle<br />

benötigten konkreten Ausprägungen der Templates von Neuem. Nehmen<br />

wir als Beispiel an, dass wir <strong>in</strong> e<strong>in</strong>em Programm vier verschiedene cpp Files<br />

haben. In jedem e<strong>in</strong>zelnen dieser Files würde unser Buffer Template Header<br />

<strong>in</strong>kludiert werden und <strong>in</strong> jedem e<strong>in</strong>zelnen File würde e<strong>in</strong> Buffer gebraucht<br />

werden. So, wie wir bisher mit Templates gearbeitet haben, würde<br />

der Compiler nun auch für jedes der e<strong>in</strong>zelnen Files e<strong>in</strong>e neue, identische<br />

konkrete Ausprägung e<strong>in</strong>- und desselben Buffers für <strong>in</strong>t32 erzeugen. Zum<br />

Glück ist von Seiten des Compilers dafür gesorgt, dass diese identischen Ausprägungen<br />

nur <strong>in</strong>nerhalb e<strong>in</strong>er Compilation Unit sichtbar s<strong>in</strong>d, sonst würde<br />

sich der L<strong>in</strong>ker beschweren. Nichts desto Trotz haben wir es hier mit s<strong>in</strong>nlos<br />

erzeugtem Code zu tun, denn es würde ja reichen, dass e<strong>in</strong>e Ausprägung<br />

e<strong>in</strong>mal erzeugt wird und dann e<strong>in</strong>fach <strong>in</strong> den anderen Compilation Units<br />

wiederverwendet wird, wenn sie schon existiert.<br />

Leider habe ich an dieser Stelle mehr schlechte als gute Nachrichten. Es<br />

ist nämlich im Pr<strong>in</strong>zip nicht möglich, die Def<strong>in</strong>ition e<strong>in</strong>es Templates e<strong>in</strong>fach<br />

<strong>in</strong> e<strong>in</strong> getrenntes File zu schreiben, das für sich alle<strong>in</strong> übersetzt und dann zum

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!