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.3 Class Templates 423<br />

der die altbekannte template Deklaration und anstatt nur den<br />

Klassennamen als Scope für die Methode zu verwenden, verwendet man bei<br />

Templates e<strong>in</strong>e besondere Ausprägung des Templates. In unserem Fall ist<br />

es Buffer. Dies bewirkt, dass für jede Ausprägung entsprechend<br />

auch e<strong>in</strong>e neue Ausprägung der Methode erzeugt wird, was natürlich<br />

notwendig ist.<br />

Nur um e<strong>in</strong>em oft gemachten Denkfehler vorzubeugen: Manche Leser<br />

könnten jetzt anmerken, dass es ja Fälle geben kann, <strong>in</strong> denen e<strong>in</strong>e Methode<br />

von der Ausprägung des Templates unabhängig ist. E<strong>in</strong>e Methode, die bei<br />

unserem Buffer die Anzahl der gespeicherten Elemente liefert, wäre theoretisch<br />

e<strong>in</strong> solcher Fall, denn diese Anzahl ist immer e<strong>in</strong>fach <strong>in</strong> num_elements_<br />

gespeichert. Jedoch, wer garantiert uns, dass das <strong>in</strong>nere Layout der Klasse <strong>in</strong><br />

den verschiedenen Ausprägungen äquivalent ist? Die Offsets der verschiedenen<br />

Variablen können sich sehr wohl über verschiedene Ausprägungen h<strong>in</strong>weg<br />

verändern und damit ist es mit der Gleichheit von Methoden vorbei!<br />

Vorsicht Falle: In den Zeilen 89–90 sieht man im Copy Constructor unseres<br />

Buffers, dass <strong>in</strong> e<strong>in</strong>er Schleife alle Elemente e<strong>in</strong>zeln kopiert werden.<br />

Manche Leser mögen nun geneigt se<strong>in</strong>, zu sagen, dass dies doch nicht besonders<br />

performant ist und dass man durch Verwendung von memcpy hier<br />

e<strong>in</strong>e deutliche Performancesteigerung erreichen kann. Dies jedoch würde <strong>in</strong><br />

bestimmten Fällen zur Katastrophe führen, denn damit umgeht man den Copy<br />

Constructor der Elemente! In der “langsamen” Implementation, die hier<br />

geschrieben wurde, werden diese jedoch garantiert aufgerufen.<br />

Es wurde bereits vorweggenommen, wie man bestimmte Ausprägungen<br />

von Class Templates erzeugt: Man stellt e<strong>in</strong>fach den Typ bzw. die Typen<br />

der gewünschten Ausprägung <strong>in</strong> spitzen Klammern dem Klassennamen nach.<br />

Genau dies wird auch im folgenden Testprogramm gemacht, um e<strong>in</strong>erseits<br />

e<strong>in</strong>en Buffer für char Daten und andererseits e<strong>in</strong>en Buffer für float Daten<br />

zur Verfügung zu haben (buffer_class_test.cpp):<br />

1<br />

2 // b u f f e r c l a s s t e s t . cpp − demo how to work with c l a s s templates<br />

3<br />

4 #<strong>in</strong>clude <br />

5<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 . h”<br />

7<br />

8 <strong>in</strong>t ma<strong>in</strong> ( <strong>in</strong>t argc , char ∗ argv [ ] )<br />

9 {<br />

10 Buffer c h a r b u f f e r ;<br />

11 Buffer f l o a t b u f f e r ;<br />

12<br />

13 c h a r b u f f e r . put ( ’ a ’ ) ;<br />

14 c h a r b u f f e r . put ( ’ b ’ ) ;<br />

15 c h a r b u f f e r . put ( ’ c ’ ) ;<br />

16 c h a r b u f f e r . put ( ’ d ’ ) ;<br />

17<br />

18 f l o a t b u f f e r . put ( 1 . 0 f ) ;<br />

19 f l o a t b u f f e r . put ( 2 . 0 f ) ;<br />

20 f l o a t b u f f e r . put ( 3 . 0 f ) ;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!