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.

9.2 E<strong>in</strong>fache Klassen 191<br />

Str<strong>in</strong>g auch e<strong>in</strong>fach mit e<strong>in</strong>em char <strong>in</strong>itialisieren kann. Der Compiler hat<br />

sich auch <strong>in</strong> ke<strong>in</strong>ster Weise darüber beschwert, der Output des Programms<br />

zeigt jedoch, dass hier nicht wirklich das passiert, was man gerne hätte:<br />

DummyStr<strong>in</strong>g : constructor with s t r i n g<br />

DummyStr<strong>in</strong>g : copy constructor<br />

DummyStr<strong>in</strong>g : constructor with length<br />

DummyStr<strong>in</strong>g : d e s t r u c t o r<br />

DummyStr<strong>in</strong>g : d e s t r u c t o r<br />

DummyStr<strong>in</strong>g : d e s t r u c t o r<br />

Sieht man sich die dritte Zeile des Outputs an, so wird doch glatt hier der<br />

Konstruktor aufgerufen, der als Parameter die Länge des Str<strong>in</strong>gs enthält!<br />

Was aber wahrsche<strong>in</strong>lich beabsichtigt war, war die Initialisierung des Str<strong>in</strong>gs,<br />

so dass er e<strong>in</strong>fach e<strong>in</strong> x enthalten sollte. Der Compiler, der von der Absicht<br />

der Entwickler ke<strong>in</strong>e Ahnung hat, hat das allerd<strong>in</strong>gs ganz anders gesehen: Er<br />

hat e<strong>in</strong>en Konstruktor gesucht, der als Datentyp e<strong>in</strong>en char nimmt. Diesen<br />

gibt es nicht. Sehr wohl aber gibt es e<strong>in</strong>en Konstruktor, der dazu kompatibel<br />

ist, nämlich den Konstruktor, der die Länge als Parameter nimmt. E<strong>in</strong> char<br />

ist ja e<strong>in</strong>e Ganzzahl und der Konstruktor nimmt e<strong>in</strong>e Ganzzahl. Also ist mit<br />

e<strong>in</strong>er kle<strong>in</strong>en Typumwandlung alles bestens – oder, wie <strong>in</strong> unserem Fall hier,<br />

ganz und gar nichts mehr <strong>in</strong> Ordnung.<br />

Zum Glück gibt es e<strong>in</strong>en sauberen Weg, es gleich gar nicht zu e<strong>in</strong>er solchen<br />

Gefahr kommen zu lassen: Man kann dem Compiler mitteilen, dass<br />

bestimmte Konstruktoren niemals implizit e<strong>in</strong>gesetzt werden sollen, sondern<br />

nur explizit aufgerufen werden dürfen. Das Zauberwort dazu nennt sich <strong>in</strong>tuitiverweise<br />

explicit. Vorausschauende Entwickler würden also die Str<strong>in</strong>g<br />

Klasse folgendermaßen deklarieren (forc<strong>in</strong>g_explicit_constructor.cpp):<br />

19 class DummyStr<strong>in</strong>g<br />

20 {<br />

21 char ∗ s t r i n g ;<br />

22 u<strong>in</strong>t32 l e n g t h ;<br />

23 public :<br />

24 explicit DummyStr<strong>in</strong>g( u<strong>in</strong>t32 length ) ;<br />

25 DummyStr<strong>in</strong>g( const char ∗ s t r ) ;<br />

26 DummyStr<strong>in</strong>g( const DummyStr<strong>in</strong>g & s r c ) ;<br />

27 ˜DummyStr<strong>in</strong>g ( ) ;<br />

28 } ;<br />

In Zeile 24 wurde der gefährliche Konstruktor als explicit deklariert. Wie<br />

man an folgender Implementation von ma<strong>in</strong> sieht, ist hiermit die Fehlverwendung<br />

unterbunden, denn Zeile 81 würde <strong>in</strong> e<strong>in</strong>em Compilerfehler resultieren:<br />

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

77 {<br />

78 DummyStr<strong>in</strong>g s t r i n g 1 = ” otto ” ;<br />

79 DummyStr<strong>in</strong>g s t r i n g 2 = s t r i n g 1 ;<br />

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

81 // DummyStr<strong>in</strong>g s t r i n g 3 = ’ x ’ ;<br />

82<br />

83 // t h i s works , because of the e x p l i c i t c a l l<br />

84 DummyStr<strong>in</strong>g s t r i n g 4 ( 1 2 ) ;

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!