Almetare
1.15
Alle meine Taschenrechner - Eine C++-Bibliothek zur Entwicklung von Taschenrechnern
|
Template-Klasse fuer einen Stack mit Logging bei Stack-Operationen. Mehr ...
#include <stack.h>
Öffentliche Methoden | |
Stack (list< Stack< T > > *listP=NULL) | |
void | push (const T &x) |
Push-Funktion mit Ausgabe einer Liste von Stacks. Mehr ... | |
T | pop () |
Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks. Mehr ... | |
T | top () |
Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist. Mehr ... | |
T | 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. | |
T | mTopButOne |
das Element, das vor dem letzten gepusht wurde (noetig fuer "y-Register" der Casio Rechner) | |
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.
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.
op | String, der die Operation beschreibt ("pushed" oder "popped") |
T Stack< T >::pop | ( | ) |
Pop-Funktion mit Rueckgabe des letzten Wertes und Ausgabe einer Liste von Stacks.
void Stack< T >::push | ( | const T & | x | ) |
Push-Funktion mit Ausgabe einer Liste von Stacks.
x | ein Objekt des zu pushenden Typs |
T Stack< T >::top | ( | ) |
Top-Funktion mit Ausgabe der Liste, die in Klasse ComputerBase definiert ist.