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.

432 13. Templates<br />

hält und schließlich noch e<strong>in</strong>e für double *. Vom Standpunkt des Laufzeitverhaltens,<br />

der Typkompatibilität und der Typsicherheit ist ja alles <strong>in</strong><br />

Ordnung. Bei genauerem Nachdenken erkennt man allerd<strong>in</strong>gs schnell, dass<br />

die ganze Angelegenheit doch e<strong>in</strong>en gröberen Haken hat: In allen drei Fällen<br />

speichert man e<strong>in</strong>fach nur Po<strong>in</strong>ter. Worauf diese zeigen, ist unserem Buffer<br />

<strong>in</strong>tern völlig egal, denn dieser <strong>in</strong>teressiert sich nur für die <strong>in</strong>terne Organisation<br />

des Speichers zum Ablegen derselben. Mit den Werten, auf die sie zeigen,<br />

hat e<strong>in</strong> Buffer nichts am Hut. Po<strong>in</strong>ter s<strong>in</strong>d e<strong>in</strong>fach immer gleich groß, egal,<br />

worauf sie zeigen, denn Computer haben eben e<strong>in</strong>mal e<strong>in</strong>e fixe Adresslänge.<br />

Für den Compiler gibt es aber nicht e<strong>in</strong>fach nur Adressen, sondern Po<strong>in</strong>ter<br />

s<strong>in</strong>d auch typisiert. Deshalb wird er für jede der obigen Ausprägungen<br />

e<strong>in</strong>es Buffers e<strong>in</strong>e vollständige konkrete Ausprägung des Templates erzeugen.<br />

Dass das dazu führen kann, dass Unmengen an quasi gleichem Code erzeugt<br />

werden, ist leicht e<strong>in</strong>zusehen.<br />

Es wäre also schön, wenn wir e<strong>in</strong>e e<strong>in</strong>fache Möglichkeit hätten, alle Ausprägungen<br />

von Buffers, die irgendwelche Po<strong>in</strong>ter halten, unter e<strong>in</strong>er bestimmten<br />

Ausprägung des Templates zusammenzufassen. Alle anderen Ausprägungen<br />

sollen wie gewohnt e<strong>in</strong>zeln und getrennt erzeugt werden.<br />

Damit s<strong>in</strong>d wir endlich bei der Erklärung der Kapitelüberschrift: Für<br />

diese Art des Zusammenfassens mehrerer Template-Ausprägungen wird oft<br />

der Begriff der Spezialisierung verwendet. Bevor wir zur Lösung des gerade<br />

eben angerissenen Problems mit den Po<strong>in</strong>tern kommen, möchte ich e<strong>in</strong>mal<br />

kurz das Pr<strong>in</strong>zip zeigen, durch das man Spezialisierungen erzeugt. Um genau<br />

zu sehen, was nun aus dem orig<strong>in</strong>alen Template kommt und was aus der<br />

Spezialisierung, wurde das ursprüngliche Template leicht verändert und um<br />

entsprechende Outputs ergänzt. Jede Methode (<strong>in</strong>klusive Konstruktoren,<br />

etc.) meldet sich nun mit dem Str<strong>in</strong>g generic ... wenn sie aufgerufen<br />

wird. Ansonsten ist diese Version vollkommen identisch zur Urversion und<br />

dementsprechend ist es s<strong>in</strong>nlos, sie hier abzudrucken.<br />

Die Deklaration der besonderen Spezialisierung auf void * sieht folgendermaßen<br />

aus (buffer_class_void_ptr_specialization.h):<br />

7<br />

8<br />

9 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

10 /∗<br />

11 ∗ s p e c i a l i z a t i o n of the Buffer template f o r void p o i n t e r s<br />

12 ∗<br />

13 ∗/<br />

14<br />

15 template class Buffer<br />

16 {<br />

17 public :<br />

18 static const u<strong>in</strong>t32 MAX NUM ELEMENTS = 8;<br />

19 private :<br />

20 // f o r b i d assignment by mak<strong>in</strong>g operator p r i v a t e<br />

21 const Buffer& operator = ( const Buffer&)<br />

22 { return (∗ this ) ; }<br />

23 protected :<br />

24 u<strong>in</strong>t32 num elements ;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!