cursor

Top  Previous  Next

Skripte > Klassen-Elemente und C++-Befehle > interpretierte C++-Anweisungen > Container > cursor

 

Zu jedem Container-Typ gehört ein entsprechender Cursor-Typ. Mittels des Cursors können einzelne Elemente des Containers gesucht werden und der Inhalt des Elements kann gelesen werden.

Jeder Container enthält intern einen Cursor und die Methoden des Cursors werden direkt als Methoden des Containers aufgerufen. Ein Cursor kann aber auch extern deklariert werden. Die Typ-Bezeichnung des Cursors ergibt sich dabei aus der Bezeichnung des zugehörigen Containers, der der Ausdruck: "::cursor" angehängt wird.

 

Beispiel:

 

Benutzung des internen Cursors:

 

vstr v;

v.push_back("tt");

v.push_back("TETRA");

v.reset();

while ( v.gotoNext() )

  out << v.value() << endl;

 

oder Deklaration eines externen Cursors:

 

vstr v;

v.push_back("tt");

v.push_back("TETRA");

vstr::cursor cr = v.getCursor();

while ( cr.gotoNext() )

  out << cr.value() << endl;

 

Der direkte Aufruf des internen Cursors wird wegen seiner Einfachheit der Deklaration eines externen Cursors meist vorgezogen werden. Soll aber beispielsweise ein Bereich des Containers markiert werden, so ist ein externer Cursor notwendig.

Auch hat die Verwendung des internen Cursors einen Nebeneffekt. Durch die Veränderung der Position des internen Cursors wird der Zustand des Containers verändert, da die Position seines Cursors Teil diese Zustandes ist. In einem const-Parser kann der interne Cursor daher nicht verwendet werden.

 

Der Cursor selbst kann drei Zustände haben:

 

1. er steht vor dem ersten bzw. hinter dem letzten Element: die Funktion hasCurrent ergibt dann false.

 

cr.hasCurrent() == false

 

2. er bezeichnet einen Wert. Nun gilt

 

cr.hasCurrent() == true

 

Sobald der Inhalt des Containers durch Hinzufügen oder Entfernen eines Elements verändert wird, wird der Cursor-Position (nicht der Cursor selbst) wieder ungültig, d.h es gilt wieder:

 

cr.hasCurrent() == false

 

3. er kann ungültig sein, wenn keine Verbindung zu einem Container besteht.

 

cr.isValid() == false

 

Eine Verbindung zu einem Container wird hergestellt durch den Aufruf der Container-Methode getCursor (s.Beispiel oben). Sie kann aber verlorengehen, wenn der Container aufhört zu existieren.

 

Beispiel:

 

vstr::cursor GetInvalidCursor( )

{

vstr v;

return vstr::cursor(v);

}

 

 

Methodenaufrufe eines ungültigen Cussors erzeugen keinen Fehler, sind aber nutzlos.

Im Unterschied zu einem externen Cursor ist ein interner Cursor ist niemals ungültig; seine Existenz endet mit der des Containers.

 



Diese Seite gehört zur TextTransformer Dokumentation

Home  Inhalt  English