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.

s p e c i a l i z e d d e s t r u c t o r<br />

s p e c i a l i z e d d e s t r u c t o r<br />

g e n e r i c d e s t r u c t o r<br />

g e n e r i c d e s t r u c t o r<br />

13.5 Explizite Spezialisierungen 441<br />

Es ist hier auch sehr schön am Output zu erkennen, dass durch das Inkludieren<br />

des Headers mit unserer ersten Spezialisierung des Buffers auf void *<br />

auch wirklich diese Spezialisierung bei der Ableitung herangezogen wird.<br />

Um zu zeigen, dass man unsere jetzige Spezialisierung nicht unbed<strong>in</strong>gt<br />

zweistufig vornehmen muss, sondern diese auch direkt aus dem generischen<br />

Code erzeugen kann, ändern wir unser Testprogramm e<strong>in</strong> wenig ab, sodass es<br />

die void * Spezialisierung nicht mehr <strong>in</strong>kludiert. Das bedeutet, dass unsere<br />

allgeme<strong>in</strong>e Po<strong>in</strong>ter-Spezialisierung nun direkt von e<strong>in</strong>er vom Compiler generierten<br />

Ausprägung des Buffers abgeleitet ist. Abgesehen von e<strong>in</strong>em kle<strong>in</strong>en<br />

Stolperste<strong>in</strong> funktioniert dies natürlich auch...<br />

Vorsicht Falle: Leitet man e<strong>in</strong>e Spezialisierung von e<strong>in</strong>er bestimmten Ausprägung<br />

e<strong>in</strong>es Templates ab, die vom Compiler generiert werden muss, so<br />

kann es je nach Compiler zu e<strong>in</strong>em auf den ersten Blick unerklärlichen Effekt<br />

kommen: Der Compiler weigert sich die Spezialisierung zu übersetzen mit<br />

dem H<strong>in</strong>weis darauf, dass z.B. <strong>in</strong> unserem Fall Buffer ke<strong>in</strong>e Basisklasse<br />

der Spezialisierung sei.<br />

Bei näherem Nachdenken wird dieser Effekt erklärbar: Wenn man von<br />

e<strong>in</strong>er Klasse ableitet, dann geht der Compiler davon aus, dass die Basisklasse<br />

auch existiert. Viele Compiler ziehen gar nicht <strong>in</strong> Betracht, dass sie vielleicht<br />

selbst dafür verantwortlich se<strong>in</strong> könnten, diese Basisklasse zuerst e<strong>in</strong>mal aus<br />

e<strong>in</strong>em Template selbst zu generieren, bevor sie weitermachen. Soll heißen,<br />

rekursives Generieren von Template-Ausprägungen wird nicht wirklich immer<br />

unterstützt.<br />

Zum Glück können wir im Notfall selbst dafür sorgen, dass der Compiler<br />

e<strong>in</strong>e existierende Instanz vorf<strong>in</strong>det: Wir brauchen ihn nur früh genug dazu<br />

zu zw<strong>in</strong>gen, e<strong>in</strong>e solche zu erzeugen und schon ist er zufrieden. Wie erzeugt<br />

man e<strong>in</strong>e solche? Ganz e<strong>in</strong>fach: Man legt e<strong>in</strong>e entsprechende Variable an.<br />

Im Fall unseres Programms würde dies z.B. folgendermaßen aussehen:<br />

6 #<strong>in</strong>clude ” b u f f e r c l a s s t e m p l a t e v 4 . h”<br />

7 static Buffer dummy void ptr buffer ;<br />

8 #<strong>in</strong>clude ” b u f f e r c l a s s p t r s p e c i a l i z a t i o n . h”<br />

In Zeile 7 wird e<strong>in</strong>e s<strong>in</strong>nlose Variable angelegt, der Compiler erzeugt dadurch<br />

den notwendigen Code und schon funktioniert die Ableitung klaglos.<br />

Vorsicht Falle: Ich gebe ja zu, dass es ziemlich dumm aussieht, wenn die<br />

Lösung zu e<strong>in</strong>er Falle gleich selbst wieder e<strong>in</strong>e andere Falle be<strong>in</strong>haltet, aber<br />

leider ist es <strong>in</strong> diesem Fall so:<br />

Manche Leser mögen sich denken, dass es wirklich Verschwendung ist,<br />

gleich e<strong>in</strong>e globale Variable mit e<strong>in</strong>em Buffer anzulegen, der ja doch nie gebraucht<br />

wird. Viel weniger Speicher braucht da schon e<strong>in</strong> Po<strong>in</strong>ter auf e<strong>in</strong>en

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!