Klassenstruktur

Der genaue Aufbau der Klasse CList dürfte aus dem Listing CList.h im Kombination mit der Funktions- und Datenstrukturbeschreibung ausreichend hervorgehen. Ich möchte trotzallem auf einige wesentliche Grundlagen der Klassenstruktur eingehen.

Schnittstellenfunktionen

Zugriffsfunktionen

Alle lesenden Zugriffsfunktionen fordern die Angabe eines Indexes, wodurch mehrere Objekte die gleiche Liste simultan nutzen können. Zugriffsfunktionen im Stile von MoveNext oder MovePrevious würden hier die Verwendbarkeit einschränken, solange keine Zugriffsnummern eingeführt würden.

Virtuelle, öffentliche Funktionen

Um sicherzustellen, daß die Liste als Basisklasse für zukünftige Erweiterungen verwendbar ist, wurden mehrere Member - Funktionen als virtual deklariert:

template <class T>
class CList<T>
{
...
public:
virtual int RemoveDate (int iPos, T & pResult);
virtual int AddData (T pData);
...
}

Es ist nicht notwendig, die Zugriffsfunktion CList::GetData virtuell zu implementieren, da sie, wie auch CList:AddData und CList::RemoveData, auf eine interne Hilfsfunktion zurückgreift. Dadurch wird in CList::GetData nur noch das Listenelement angefordert und danach das gespeicherte Datum zurückgeliefert.

Sonstige Funktionen

int IsEmpty()

Je nach Anwendungsgebiet erschien es mir sinnvoll, eine Möglichkeit zur Abfrage des m_pFirst - Zeigers hinzuzufügen. Dadurch erhält die Anwendung die Möglichkeit, auf eine leere Liste zu prüfen, beispielsweise um bei Ausgabe - Funktionen einer komplexen Behandlung der ersten Ausgabe aus dem Weg zu gehen.

void Dump()

Zusätzlich existiert zur Fehlersuche eine Debugfunktion, die den aktuellen Listeninhalt auf cout ausgiebt. Bedingung hierfür sit, das die Liste mit _DEBUG kompiliert wird. Es entsteht folgende Bildschirmausgabe (Beispiel):

*** DEBUG - Ausgabe Objekt CList in 0x804a4a8
Element 1 at 0x804a4c8 contains 1
Element 2 at 0x804a4e8 contains 4
Element 3 at 0x804a508 contains 9
Element 4 at 0x804a528 contains 16
Element 5 at 0x804a548 contains 25
*** DEBUG - Ausgabe abgeschlossen

Wie hierraus hervorgeht, werden ebenfalls die einzelnen gesicherten Daten ausgegeben. Dies ist allerdings nur möglich, wenn Zeiger gespeichert werden und für die durch die Zeiger definierten Objekte der Stream - Ausgabeoperator << definiert ist.
Wird eine dieser Bedingungen nicht erfüllt, sollte auf die Verwendung dieser Funktion verzichtet werden.

Private Hilfsfunktionen

Derzeit existiert eine einzige private Hilfsfunktion:

template <class T>
class CList<T>
{
...
private:
virtual CElement * GetElement(int iPos);
...
}

Diese Funktion ist das Kernstück der lesenden Zugriffsfunktionen. Sie sucht jeweils das zu einem Index iPos passende CElement - Objekt und liefert es an die aufrufende Funktion zurück. Sollte die Klasse erweitert werden, ist hier ein einfacher Ansatzpunkt für alle Zugriffsfunktionen, die einen Index dereferenzieren müssen.

Private Hilfsklassen

Die Klasse Clist enthält eine private Hilfsklasse zur Datenspeicherung. Diese Klasse wurde aus zwei Gründen privat implementiert. Einderseits soll die Chance auf Namenskonflikte im Globalen Namensraum möglichst minimiert werden, andererseits ist der Aufbau der Listenelemente nur für die Listenklasse selbst von Bedeutung.