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.

10.2.5 Konkrete Deletors<br />

10.2 Das DDD 267<br />

Für die verschiedenen Elementtypen, die <strong>in</strong> Vektoren gespeichert werden,<br />

müssen natürlich die entsprechenden konkreten Deletors implementiert werden.<br />

Diese wurden gleich kurzerhand alle geme<strong>in</strong>sam <strong>in</strong> e<strong>in</strong> File verpackt.<br />

Der e<strong>in</strong>zig <strong>in</strong>teressante Aspekt bei diesen konkreten Implementationen ist,<br />

dass es sich hier um e<strong>in</strong>e leichte Abwandlung des S<strong>in</strong>gleton Design Patterns<br />

handelt: Es gibt von jedem dieser konkreten Deletors im gesamten System<br />

nur jeweils e<strong>in</strong>e e<strong>in</strong>zige Instanz. Dies ist deshalb s<strong>in</strong>nvoll, weil diese Deletors<br />

ke<strong>in</strong>e Status<strong>in</strong>formation speichern. Und man will ja nicht für jeden e<strong>in</strong>zelnen<br />

Vektor immer wieder unnötig e<strong>in</strong>en neuen Deletor anlegen, den man eigentlich<br />

sowieso schon hat. Um nun nicht mit irgendwelchen Merkervariablen<br />

Abhängigkeiten und Seiteneffekte zu erzeugen, gibt es bei unseren konkreten<br />

Deletors immer e<strong>in</strong>e static Methode getInstance, über die man e<strong>in</strong>e<br />

Referenz auf die e<strong>in</strong>zige existente Instanz des Deletors erhält.<br />

Der erste Deletor <strong>in</strong> den Zeilen 17–54 ist auch gleich e<strong>in</strong> nettes Paradoxon:<br />

Wie der Name DontDelete schon sagt, ist er e<strong>in</strong> Deletor, der gar nicht daran<br />

denkt, etwas zu löschen :-). Der Grund für dessen Existenz ist e<strong>in</strong>fach: Aus<br />

Sicherheitsgründen wollte ich nicht mit Po<strong>in</strong>ters auf Deletors arbeiten, denn<br />

dabei kann man groben Unfug treiben (z.B. die e<strong>in</strong>zige Instanz löschen, etc.).<br />

Daher wird im Programm immer nur mit Referenzen auf Deletors gearbeitet,<br />

so auch im Vektor selbst. Mit Referenzen hat man allerd<strong>in</strong>gs im Vektor die<br />

Möglichkeit nicht, e<strong>in</strong>fach e<strong>in</strong>en 0 Po<strong>in</strong>ter als Signal für “nichts löschen” zu<br />

verwenden. Deshalb ruft der Vektor immer den ihm übergebenen Deletor auf<br />

und im Fall, dass man nichts löschen will, übergibt man eben die Instanz des<br />

DontDelete Deletors. Durch diese Maßnahme wird das Programm auch bei<br />

späteren Änderungen robuster gegen schwer zu f<strong>in</strong>dende Po<strong>in</strong>terfehler. Es<br />

ist nichts leichter, als im Vektor bei e<strong>in</strong>er Änderung e<strong>in</strong>e 0-Abfrage auf den<br />

Deletor Po<strong>in</strong>ter zu vergessen...<br />

1 // c o n c r e t e o b j e c t d e l e t o r s . h − a c o l l e c t i o n o f the concrete<br />

2 // o bject d e l e t o r s that are used f o r the v e c t o r s <strong>in</strong> the<br />

3 // memory game<br />

4<br />

5 #ifndef c o n c r e t e o b j e c t d e l e t o r s h<br />

6 #def<strong>in</strong>e c o n c r e t e o b j e c t d e l e t o r s h<br />

7<br />

8 #<strong>in</strong>clude ” o b j e c t d e l e t o r . h”<br />

9 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

10 #<strong>in</strong>clude ” s i m p l e v e c t o r . h”<br />

11 #<strong>in</strong>clude ” s i m p l e d i s p l a y a b l e . h”<br />

12<br />

13 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

14 /∗ A concrete d e l e t o r that does not d e l e t e anyth<strong>in</strong>g :−)<br />

15 ∗/<br />

16<br />

17 class DontDelete : public ObjectDeletor<br />

18 {<br />

19 private :<br />

20 /∗ Copy construction i s not allowed<br />

21 ∗/<br />

22 DontDelete ( const DontDelete& s r c ) {}

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!