Almetare  1.15
Alle meine Taschenrechner - Eine C++-Bibliothek zur Entwicklung von Taschenrechnern
Stack< T > Template-Klassenreferenz

Template-Klasse fuer einen Stack mit Logging bei Stack-Operationen. Mehr ...

#include <stack.h>

Klassendiagramm für Stack< T >:

Öffentliche Methoden

 Stack (list< Stack< T > > *listP=NULL)
 
void push (const T &x)
 Push-Funktion mit Ausgabe einer Liste von Stacks. Mehr ...
 
pop ()
 Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks. Mehr ...
 
top ()
 Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist. Mehr ...
 
getTopButOne () const
 
bool isEmpty () const
 
void setTopButOne (const T &x)
 
void setListP (list< Stack< T > > *lP)
 
void out (string op)
 Gibt Stack in Debug-Log-Datei aus. Mehr ...
 

Private Attribute

list< Stack< T > > * mListP
 Liste von Stacks.
 
mTopButOne
 das Element, das vor dem letzten gepusht wurde (noetig fuer "y-Register" der Casio Rechner)
 

Ausführliche Beschreibung

template<class T>
class Stack< T >

Template-Klasse fuer einen Stack mit Logging bei Stack-Operationen.

Die Klasse ist im Prinzip identisch mit der Klasse vector aus der STL. Der Unterschied besteht im wesentlichen darin, dass die Funktionen push() und pop() zu Debug- und Logging-Zwecken eine Ausgabe des aktuellen Stacks in ein Debug-Log-Objekt der Klasse Log bzw. auf die Konsole durchfuehren.

Da im Almetare-Projekt Listen von Stacks verwendet werden und alle Stacks einer Liste ausgegeben werden sollen, enthaelt die Klasse als Member den Zeiger auf die Stack-Liste, zu der der Stack gehoert, und die ganze Liste der Stacks wird bei jedem push() und pop() ausgegeben.

Template-Problematik:

Wie bei Templates ueblich, sorgt die Kompilierung der Datei stack.cpp noch nicht dafuer, dass auch Code generiert wird. Dies geschieht erst bei der Instanziierung mit konkreten Datentypen (Almetare: nur double und SymOperator*).

Wird ein Stack jetzt in einer anderen Datei als stack.cpp benoetigt (ist bei Bibliotheken ja normal) sollte dort die Inkludierung von stack.h ausreichen, falls die Klasse Stack bzw. die Template-Funktionen mit dem Schluesselwort 'export' qualifiziert werden (Stroustrup Kapitel 13.7 "Templates - Organisation des Quellcodes"). Leider kennen weder GNU noch MSVC++ das Wort 'export'.

Loesung: Entweder man inkludiert stack.cpp in jeder Datei, die Stacks braucht, oder man macht in stack.cpp eine Explizite Instanziierung mit den benoetigten Stack-Typen. Im letzteren Fall ist jedoch Information von der die Bibiothek benutzenden Anwendung in die Bibliotheksdatei gewandert! Die MSVC-Datei VECTOR enthaelt den Code anscheinend auch direkt, ist also eigentlich eine *.cpp-Datei.

Noetig ist ein Zahlen- und ein Symbol-Stack. Man koennte auch direkt die STL-Templates vector<double> und vector<string> nehmen; dieses Template erlaubt es aber, beim Pushen und Poppen den aktuellen Stack auszugeben. Außerdem: Um Klammerebenen abzubilden, werden zwei LISTEN von Stacks benutzt. Bei jeder "(" wird ein neuer Stack auf jede Liste geworfen. Daher enthaelt das Template einen Zeiger auf diese Stack-Liste, die bei jedem Push und Pop ausgegeben wird.

Zusaetzlich wird ein Kommando top eingefuehrt, das den obersten Wert liest, ohne ihn vom Stack zu nehmen.

Dokumentation der Elementfunktionen

◆ out()

template<class T >
void Stack< T >::out ( string  op)

Gibt Stack in Debug-Log-Datei aus.

Wenn der Listenzeiger gesetzt ist, wird die ganze Liste von Stacks ausgegeben.

Parameter
opString, der die Operation beschreibt ("pushed" oder "popped")

◆ pop()

template<class T >
T Stack< T >::pop ( )

Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks.

Rückgabe
oberstes Objekt auf dem Stack

◆ push()

template<class T>
void Stack< T >::push ( const T &  x)

Push-Funktion mit Ausgabe einer Liste von Stacks.

Parameter
xein Objekt des zu pushenden Typs

◆ top()

template<class T >
T Stack< T >::top ( )

Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist.

Rückgabe
oberstes Objekt auf dem Stack

Die Dokumentation für diese Klasse wurde erzeugt aufgrund der Dateien: