home *** CD-ROM | disk | FTP | other *** search
- /* LISTDEMO.CPP - Beispiel aus Kapitel 5 der
- Einführung */
-
- // Demonstriert dynamische Objekte
-
- // mit FIGURES.OBJ und GRAPHICS.LIB linken
-
- #include <conio.h> // für getch()
- #include <alloc.h> // für coreleft()
- #include <stdlib.h> // für itoa()
- #include <string.h> // für strcpy()
- #include <graphics.h>
- #include "figures.h"
-
- class Arc : public Circle
- {
- int StartAngle, EndAngle;
- public:
-
- // Konstruktor
- Arc(int InitX, int InitY, int InitRadius,
- int InitStartAngle, int InitEndAngle);
-
- // Virtuelle Funktionen
- void Show();
- void Hide();
- };
-
- struct Node
- {
- Point *Item; // Der Listeneintrag kann Point
- // oder jede von Point
- // abgeleitete Klasse sein
- Node *Next; // zeigt auf das nächste
- // Node-Objekt (einen Knoten)
- };
-
- class List // Die Objekt-Liste, auf die die
- // Knoten zeigen
- {
- Node *Nodes; // Zeigt auf einen Knoten
- public:
-
- // Konstruktor
- List();
-
- // Destruktor
- ~List();
-
- // Einen Eintrag in die Liste vornehmen
- void Add(Point *NewItem);
-
- // Die Einträge auflisten
- void Report();
- };
-
- // Definitionen für alleinstehende Funktionen
-
- void OutTextLn(char *TheText)
- {
- outtext(TheText);
- moveto(0, gety() + 12); // Zur nächsten Zeile
- }
-
- void MemStatus(char *StatusMessage)
- {
- // für den Rückgabewert von coreleft()
- unsigned long MemLeft;
-
- // temporärer String, wird an outtext()
- // geschickt
- char CharString[12];
- outtext(StatusMessage);
-
- MemLeft = long (coreleft());
-
- // Ergebnis mit ltoa in String umwandeln,
- // dann in einen temporären String kopieren
- ltoa(MemLeft, CharString, 10);
- OutTextLn(CharString);
- }
-
- // Elementfunktionen der Klasse Arc
-
- Arc::Arc(int InitX, int InitY, int InitRadius,
- int InitStartAngle, int InitEndAngle)
- : Circle (InitX, InitY,InitRadius)
- // ruft den Circle-Konstruktor auf
- {
- StartAngle = InitStartAngle;
- EndAngle = InitEndAngle;
- }
-
- void Arc::Show()
- {
- Visible = true;
- arc(X, Y, StartAngle, EndAngle, Radius);
- }
-
- void Arc::Hide()
- {
- unsigned TempColor;
- TempColor = getcolor();
- setcolor(getbkcolor());
- Visible = false;
- arc(X, Y, StartAngle, EndAngle, Radius);
- setcolor(TempColor);
- }
-
- // Elementfunktionen der Klasse List
-
- List::List () {
- Node *N;
- N = new Node;
- N->Item = NULL;
- N->Next = NULL;
- Nodes = NULL; // Knotenzeiger auf "Null"
- // setzen, da die Liste leer ist
- }
-
- List::~List() // Destruktor
- {
- // bis zum Ende der Liste
- while (Nodes != NULL)
- {
- // Zeiger auf einen Knoten, dessen
- // Inhalt gelöscht wird
- Node *N = Nodes;
- delete(N->Item);
-
- // zeigt auf den nächsten Knoten
- Nodes = N->Next;
-
- // den Speicher des Zeigers löschen
- delete N;
- };
- }
-
- void List::Add(Point *NewItem)
- {
- // N zeigt auf einen Knoten
- Node *N;
-
- // einen neuen Knoten erzeugen
- N = new Node;
-
- // Zeiger auf das Objekt im Knoten speichern
- N->Item = NewItem;
-
- // nächster Eintrag zeigt auf akt. Listenposition
- N->Next = Nodes;
-
- // letzter Eintrag zeigt nun auf diesen Knoten
- Nodes = N;
-
- }
-
- void List::Report()
- {
- char TempString[12];
- Node *Current = Nodes;
- while (Current != NULL)
- {
- // X-Wert des Eintrags des aktuellen Knotens
- // lesen und in einen String konvertieren
- itoa(Current->Item->GetX(), TempString, 10);
- outtext("X = ");
- OutTextLn(TempString);
-
- // das gleiche für den Y-Wert
- itoa(Current->Item->GetY(), TempString, 10);
- outtext("Y = ");
- OutTextLn(TempString);
-
- // auf den nächsten Knoten zeigen
- Current = Current->Next;
- };
- }
-
- void setlist(void);
-
- main() // Funktionen testen
- {
- int graphdriver = DETECT, graphmode;
- initgraph(&graphdriver, &graphmode,
- "..\\bgi");
-
- MemStatus("Speicher freigeben, bevor die "
- "Liste initialisiert wird: ");
- setlist();
- MemStatus("Speicher freigeben nach "
- "List-Destruktor: ");
- getch();
- closegraph();
- }
-
- void setlist() {
-
- // eine Liste deklarieren
- // (ruft den List-Konstruktor auf)
- List AList;
-
- // einige Figuren erzeugen und in die
- // Liste aufnehmen
- Arc *Arc1 = new Arc(151, 82, 25, 200, 330);
- AList.Add(Arc1);
- MemStatus("Speicher freigeben nach Zufügen "
- "von arc1: ");
-
- Circle *Circle1 = new Circle(200, 80, 40);
- AList.Add(Circle1);
- MemStatus("Speicher freigeben nach Zufügen "
- "von circle1: ");
-
- Circle *Circle2 = new Circle(305, 136, 35);
- AList.Add(Circle2);
- MemStatus("Speicher freigeben nach Zufügen "
- "von circle2: ");
-
- // Liste durchgehen und X-Y-Werte der
- // Figuren zeigen
- AList.Report();
-
- /* Die 3 Alist-Knoten und die Objekte Arc und
- Circle werden von ihren Destruktoren
- automatisch freigegeben, wenn sie nicht
- mehr im Gültigkeitsbereich von main() sind.
- Arc und Circle benutzen implizit Destruktoren
- im Gegensatz zum expliziten ~List-Destruktor.
- Sie können hier aber auch explizit löschen,
- wenn Sie das wünschen:
-
- delete Arc1; delete Circle1; delete Circle2;
- */
-
- getch(); // auf einen Tastendruck warten
- return;
- }