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.

13.1 Function Templates 413<br />

keiten etwaiger Fehlverwendungen unseres schönen Templates etwas näher<br />

(template_usage_dangers.cpp):<br />

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

112 {<br />

113 <strong>in</strong>t32 t e s t a r r a y [ ] = { 4 , 1 , 2 , 5 , 3 } ;<br />

114 RangeControlledInt num with range ( 0 , 5 0 , 5 ) ;<br />

115<br />

116 // the f o l l o w i n g l i n e r e s u l t s <strong>in</strong> a compiler e r r o r , because<br />

117 // <strong>in</strong> the template the second parameter i s used f o r<br />

118 // array <strong>in</strong>dex<strong>in</strong>g<br />

119 f<strong>in</strong>dMax ( t e s t a r r a y , 5 . 5 ) ;<br />

120<br />

121 // the f o l l o w i n g l i n e r e s u l t s <strong>in</strong> a compiler e r r o r , because<br />

122 // of two reasons :<br />

123 // ( 1 ) no constructor with an i n t parameter i s def<strong>in</strong>ed<br />

124 // ( 2 ) the ++ operator i s not implemented<br />

125 f<strong>in</strong>dMax ( t e s t a r r a y , num with range ) ;<br />

126 return ( 0 ) ;<br />

127 }<br />

Im obigen Beispiel wurde bewusst nur ma<strong>in</strong> abgedruckt. Das Template entspricht<br />

der zuletzt betrachteten Variante, die beide Parameter generisch def<strong>in</strong>iert.<br />

Die Klasse RangeControlledInt wurde direkt aus dem entsprechenden<br />

Beispiel <strong>in</strong> Abschnitt 12.2 übernommen. Wenn wir versuchen, das obige<br />

Beispiel zu compilieren, dann kommen wir leider zu ke<strong>in</strong>em lauffähigen Programm,<br />

denn der Compiler hat hier e<strong>in</strong> paar D<strong>in</strong>ge zu bemängeln.<br />

Erstens passt ihm der Aufruf von f<strong>in</strong>dMax aus Zeile 119 ganz und gar<br />

nicht. Es wird nämlich hier die Funktion mit e<strong>in</strong>em double als Längenparameter<br />

aufgerufen. Dies veranlasst den Compiler, e<strong>in</strong>e entsprechende konkrete<br />

Implementation mit e<strong>in</strong>em double zu erzeugen. Dieser wird allerd<strong>in</strong>gs<br />

<strong>in</strong> unserem Template als Index für das Array verwendet, was natürlich nicht<br />

gestattet ist.<br />

Zweitens passt dem Compiler auch der Aufruf von f<strong>in</strong>dMax aus Zeile 125<br />

nicht, denn hier wird e<strong>in</strong> RangeControlledInt als Längenparameter verwendet.<br />

Das bedeutet, dass dieser Typ auch für den return-Value und ebenso<br />

für die Laufvariable <strong>in</strong> unserem Template verwendet wird. Leider aber fehlt<br />

für diese Verwendung Entscheidendes: Es gibt ke<strong>in</strong>en Konstruktor, der e<strong>in</strong>fach<br />

nur e<strong>in</strong>en e<strong>in</strong>zigen Parameter, nämlich den Initialwert, nehmen würde.<br />

Außerdem ist der ++ Operator nicht def<strong>in</strong>iert. Beides wird aber im Template<br />

beim Arbeiten mit der Laufvariable sowie mit dem return-Value gebraucht.<br />

Man kann nun sagen, dass der Aufruf mit dem double wirklich e<strong>in</strong> grober<br />

Unfug ist und dass man daher froh se<strong>in</strong> kann, dass der Compiler darauf h<strong>in</strong>weist.<br />

Weiters kann man behaupten, dass man beim RangeControlledInt<br />

selbst die Schuld trägt, weil man auf den entsprechenden Konstruktor und<br />

den ++ Operator hätte denken sollen. Also ergänzt man diese Klasse und<br />

kommt damit auch wirklich problemlos durch den Compiler. Damit hat man<br />

sich aber e<strong>in</strong> wunderbares verstecktes Problem e<strong>in</strong>gehandelt, das verhängnisvoll<br />

se<strong>in</strong> kann: Beim Schreiben des Templates hat niemand damit gerechnet,<br />

dass beim Über- bzw. Unterschreiten e<strong>in</strong>es vorgegebenen Wertes e<strong>in</strong>e Excep-

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!