30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

25 u<strong>in</strong>t32 num elements allocated ;<br />

26 u<strong>in</strong>t32 read <strong>in</strong>dex ;<br />

27 u<strong>in</strong>t32 w r i t e i n d e x ;<br />

28 void ∗∗ elements ;<br />

29 public :<br />

30 Buffer ( )<br />

31 throw( b a d a l l o c ) ;<br />

32<br />

33 Buffer ( const Buffer &s r c )<br />

34 throw( <strong>in</strong>valid argument , b a d a l l o c ) ;<br />

35<br />

36 virtual ˜ Buffer ( )<br />

37 throw ( ) ;<br />

38<br />

39 virtual void put ( void ∗ const &element )<br />

40 throw( r a n g e e r r o r ) ;<br />

41<br />

42 virtual void ∗ getNext ( )<br />

43 throw( r a n g e e r r o r ) ;<br />

44 } ;<br />

13.5 Explizite Spezialisierungen 433<br />

In Zeile 15 sieht man, dass das Keyword template nur noch von e<strong>in</strong>er öffnenden<br />

und e<strong>in</strong>er schließenden spitzen Klammer gefolgt ist und dass ke<strong>in</strong> generischer<br />

Typ mehr angegeben wird. Das kommt daher, dass man dem Compiler<br />

auf diese Art mitteilt, für welchen bzw. welche der Template Parameter die<br />

Spezialisierung stattf<strong>in</strong>det. Die Parameter, für die man spezialisiert, kommen<br />

<strong>in</strong> der Spezialisierung nicht mehr vor. Die anderen Parameter, die weiterh<strong>in</strong><br />

vom Compiler behandelt werden sollen, bleiben erhalten.<br />

Würde man also z.B. e<strong>in</strong>e Spezialisierung unserer Variation des Templates<br />

mit den zwei Parametern machen, jedoch nur den Typ, nicht aber die Anzahl<br />

der Elemente spezialisieren wollen, so müsste hier Folgendes stehen:<br />

template<br />

class Buffer<br />

In der Folge sieht man, dass <strong>in</strong> der gesamten Deklaration alle Vorkommen<br />

des generischen Parameters durch die spezielle Ausprägung void * ersetzt<br />

wurden.<br />

Was haben wir also bisher erreicht?<br />

• Wir haben dem Compiler mitgeteilt, dass es e<strong>in</strong>e handgeschriebene Spezialisierung<br />

des Buffers für den Typ void * gibt und dass er diese besondere<br />

Ausprägung nicht mehr zu generieren braucht.<br />

• Wir haben die Deklaration dieser Spezialisierung auch wirklich von Hand<br />

vorgenommen und entsprechend angepasst. Je nach Spezialisierung wird<br />

die Anpassung verschieden ausfallen. Bei uns hat sich diese darauf beschränkt,<br />

dass wir e<strong>in</strong>fach nur den entsprechenden Typ e<strong>in</strong>gesetzt haben,<br />

wo ansonsten der generische Typ stehen würde.<br />

Wenn wir schon dem Compiler mitteilen, dass er mit dieser Ausprägung unseres<br />

Templates nichts mehr zu tun hat, dann s<strong>in</strong>d wir auch wirklich vollständig<br />

dafür verantwortlich. Das bedeutet, dass wir natürlich auch die entsprechenden<br />

Ausprägungen der Methoden selbst schreiben müssen. Genau das passiert<br />

auch <strong>in</strong> der Folge. Stellvertretend für die ganzen Methoden, die für

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!