.TL Templates im g++ .LP Es ändert sich nicht viel im Programmtext von shapes.C, wenn man Collection in eine Templateklasse verwandelt: .IP \(bu Object verwandelt sich von einer Basisklasse in eine abstrakte Typvariable .IP \(bu Link und List bekommen das Template nun als Parameter. .IP \(bu Die Typenkompatibilität wird dadurch gewährleistet, daß nun sicher alle Listenelemente vom Typ Shape sind. .IP \(bu Die ekligen Casts nach (Shape*) fallen somit weg. .LP Es können nun Mengen beliebiger Elementklassen verwaltet werden, ohne daß diese von Object abstammen müssen, daher ist Collection mit templates nicht nur sauberer und sicherer, sondern auch einfacher wiederverwendbar. Schade, daß im CC templates nicht implementiert sind. .DS 1,4c1 < // Mein erstes Programm in C++ < // Da diese Klassen ziemlich klein sind und zu unvollständig, < // um jemals wiederverwendet zu werden, verzichte ich auf das < // Theater mit x Class Header Dateien und getrennten Modulen: --- > // 2. Version von shapes.C mit templates 9,11c6 < class Object {}; // abstrakte Basisklasse < < class Collection : public Object { --- > template class Collection { 29c24 < struct Link { Object * element; Link * next; }; --- > template struct Link { Object * element; Link * next; }; 34,35c29,30 < class List: public Collection { < Link * first, * second, * iterator; --- > template class List: public Collection { > Link * first, * second, * iterator; 41c36 < second = new Link; --- > second = new Link; 88,89c83 < < class Shape: public Object { --- > class Shape { 131c126 < class Graphics: public Shape, public List { --- > class Graphics: public Shape, public List { 137,142d131 < // Daß hier ein Cast von Object* nach Shape* möglich ist, < // ist ja wohl ein Sicherheitsloch in C++. Shape ist schließlich < // keine Basisklasse von Object und man könnte hier versuchen, < // Objekte zu drehen, die gar keine Geometrie haben. Wozu das < // wohl führen würde. Jedoch ohne es wäre die Aufgabe unlösbar. < 146c135 < for (iteration(); S = (Shape*) next(); ++ count) { --- > for (iteration(); S = next(); ++ count) { 159c148 < for (iteration (); S = (Shape*) next();) { --- > for (iteration (); S = next();) { 168c157 < for (iteration (); S = (Shape*) next (); ) { --- > for (iteration (); S = next (); ) { 174c163 < void draw () { for (iteration (); S = (Shape*) next(); S -> draw ()); } --- > void draw () { for (iteration (); S = next(); S -> draw ()); } 195c184 < Graphics G, H; G += * (Shape *) & H; --- > Graphics G, H; G += H; .DE