Lektion 65:Die Klasse SetUm einen Zuweisungsoperator, einen Copy-Konstruktor und einen Destruktor brauchen wir uns in der Klasse Set nicht mehr zu kümmern. Das alles wird vom Compiler automatisch gemacht. Zum Beispiel funktioniert der vom Compiler automatisch generierte Zuweisungsoperator
völlig korrekt. Das liegt daran, daß in der Zeile
der Zuweisungsoperator der Klasse Vector aufgerufen wird. Die einzigen Methoden, die also noch benötigt werden sind Einfügen, Suchen und Löschen. Mit dem Suchen fangen wir an:
Was soll getan werden, wenn der Wert nicht in der Set vorkommt? Man müßte einen besonderen Wert kennen, von dem man weiß, daß er nicht in der Liste vorkommen kann. Leider gibt es im Allgemeinen keinen solchen Wert. Für double ließe sich vielleicht noch ein Wert finden, aber wenn die Klasse Set zu einer Template-Klasse ausgebaut wird, dann geht das nicht mehr. Es gibt aber für Zeiger einen solchen Wert: den Wert 0. Man kann sich also damit behelfen, daß ein Zeiger auf das gefundene Element zurückgegeben wird, falls es vorhanden ist, anderenfalls wird 0 zurückgegeben.
Eine sehr praktische aber nicht notwendige Methode ist die has-Methode. Sie gibt einfach nur an, ob ein bestimmtes Element in der Set vorhanden ist.
Das Einfügen ist ebenfalls eine sehr einfache Methode.
Diese Methode ist aber nicht hübsch geworden. Die Zeilen
sind einfach unpassend,
Zuerst werden diese Zeilen in die Klasse Vector verfrachtet. Dazu muß nur die Bedeutung dieser grow-Methode ein wenig verändert werden. Ab jetzt darf sie immer aufgerufen werden, aber sie vergrößert den Datenbereich nur, wenn die angeforderte Größe größer als die aktuelle Größe ist. In der Klasse Vector wird also folgende Nachbesserung angebracht:
Und in der private-Sektion der Klasse Vector kommt folgende Zeile hinzu:
Das vereinfacht die Methode insert der Klasse Set zu folgendem:
Die Methode remove ist schon komplizierter! Zunächst muß die Position des zu entfernenden Elementes gefunden werden. Dann werden alle darauf folgenden Elemente um eine Position nach vorne verschoben. Für das Finden des Index wird wieder eine eigene Methode geschrieben. Weil keine klassenfremden Funktionen mit solch einem Index etwas anfangen können, wird sie ihren Platz in der private-Sektion finden. Sie gibt als Ergebnis den Index des gefundenen Elementes zurück. Falls kein Element gefunden wurde, dann wird der Index -1 zurückgegeben.
Weil nach Möglichkeit kein Code doppelt vorhanden sein soll, wird die find-Methode entsprechend verändert.
Für das Verschieben der Elemente wird am besten in der Klasse Vector eine entsprechende Methode zur Verfügung gestellt. Sie bekommt drei Parameter:
Die remove-Methode wird als
recht übersichtlich. Vergleichen Sie bitte diese Klasse mit der Klasse StackAsVector! In der Klasse StackAsVector gab es das Attribut m_topIndex, in dieser Klasse gibt es das Attribut m_size. Da immer gilt m_topIndex==m_size-1, ist fast egal, welche Version man verwendet. Die Version mit m_size ist aber ein wenig schöner, weil z.B. die Zuweisung m_topIndex=-1 im Konstruktor schon ein wenig abwegig ist. Ein m_size=0 ist einfacher zu verstehen. ÜbungSchreiben Sie die noch nicht ausgefüllten Methoden findIndex() und moveDown(). ÜbungSpielen Sie das folgende Spiel, bis Sie drei mal hintereinander gewonnen haben! Die Lösungsstrategie, die Sie herausfinden werden, wird in der nächsten Lektion verwendet werden, um die Klasse Set erheblich schneller zu machen.
Falls Ihnen Fehler im Text auffallen oder Sie Verbesserungsvorschläge haben, dann schicken Sie mir bitte eine Mail. Ich werde mich dann sofort darum kümmern. [aktuelle Version] [inhalt] [index] [Fehlerkorrektur, Verbesserungsvorschlag] © Volkard Henkel <volkard@normannia.de>, last update: 09/06/00 |