home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / tcpp / examples / listdemo.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1990-06-10  |  5.3 KB  |  238 lines

  1. /* LISTDEMO.CPP - Beispiel aus Kapitel 5 der
  2.    Einführung */
  3.  
  4. // Demonstriert dynamische Objekte
  5.  
  6. // mit FIGURES.OBJ und GRAPHICS.LIB linken
  7.  
  8. #include <conio.h>          // für getch()
  9. #include <alloc.h>          // für coreleft()
  10. #include <stdlib.h>         // für itoa()
  11. #include <string.h>         // für strcpy()
  12. #include <graphics.h>
  13. #include "figures.h"
  14.  
  15. class Arc : public Circle
  16. {
  17.    int StartAngle, EndAngle;
  18. public:
  19.  
  20.    // Konstruktor
  21.    Arc(int InitX, int InitY, int InitRadius,
  22.        int InitStartAngle, int InitEndAngle);
  23.  
  24.    // Virtuelle Funktionen
  25.    void Show();
  26.    void Hide();
  27. };
  28.  
  29. struct Node
  30. {     
  31.    Point *Item;  // Der Listeneintrag kann Point
  32.                  //  oder jede von Point
  33.          //  abgeleitete Klasse sein
  34.    Node  *Next;  // zeigt auf das nächste
  35.                  //  Node-Objekt (einen Knoten)
  36. };
  37.  
  38. class List  // Die Objekt-Liste, auf die die
  39.             //  Knoten zeigen
  40. {
  41.    Node *Nodes;  // Zeigt auf einen Knoten
  42. public:
  43.  
  44.    // Konstruktor
  45.    List();
  46.  
  47.    // Destruktor
  48.    ~List();
  49.  
  50.    // Einen Eintrag in die Liste vornehmen
  51.    void Add(Point *NewItem);
  52.  
  53.    // Die Einträge auflisten
  54.    void Report();
  55. };
  56.  
  57. // Definitionen für alleinstehende Funktionen
  58.  
  59. void OutTextLn(char *TheText)
  60. {
  61.    outtext(TheText);
  62.    moveto(0, gety() + 12); // Zur nächsten Zeile
  63. }
  64.  
  65. void MemStatus(char *StatusMessage)
  66. {
  67.    // für den Rückgabewert von coreleft()
  68.    unsigned long MemLeft;
  69.  
  70.    // temporärer String, wird an outtext()
  71.    //  geschickt
  72.    char CharString[12];
  73.    outtext(StatusMessage);
  74.  
  75.    MemLeft = long (coreleft());
  76.  
  77.    // Ergebnis mit ltoa in String umwandeln, 
  78.    //  dann in einen temporären String kopieren
  79.    ltoa(MemLeft, CharString, 10);
  80.    OutTextLn(CharString);
  81. }
  82.  
  83. // Elementfunktionen der Klasse Arc
  84.  
  85. Arc::Arc(int InitX, int InitY, int InitRadius,
  86.          int InitStartAngle, int InitEndAngle)
  87.     : Circle (InitX, InitY,InitRadius)
  88.       // ruft den Circle-Konstruktor auf
  89. {
  90.    StartAngle = InitStartAngle;
  91.    EndAngle = InitEndAngle;
  92. }
  93.  
  94. void Arc::Show()
  95. {
  96.    Visible = true;
  97.    arc(X, Y, StartAngle, EndAngle, Radius);
  98. }
  99.  
  100. void Arc::Hide()
  101. {
  102.    unsigned TempColor;
  103.    TempColor = getcolor();
  104.    setcolor(getbkcolor());
  105.    Visible = false;
  106.    arc(X, Y, StartAngle, EndAngle, Radius);
  107.    setcolor(TempColor);
  108. }
  109.  
  110. // Elementfunktionen der Klasse List
  111.  
  112. List::List () {
  113.    Node *N;
  114.    N = new Node;
  115.    N->Item = NULL;
  116.    N->Next = NULL;
  117.    Nodes = NULL;  // Knotenzeiger auf "Null"
  118.           //  setzen, da die Liste leer ist
  119. }
  120.  
  121. List::~List()     // Destruktor
  122. {
  123.    // bis zum Ende der Liste
  124.    while (Nodes != NULL)
  125.    {
  126.       // Zeiger auf einen Knoten, dessen
  127.       //  Inhalt gelöscht wird
  128.       Node *N = Nodes;
  129.       delete(N->Item);
  130.  
  131.       // zeigt auf den nächsten Knoten       
  132.       Nodes = N->Next;
  133.  
  134.       // den Speicher des Zeigers löschen
  135.       delete N;
  136.    };
  137. }
  138.  
  139. void List::Add(Point *NewItem)
  140. {
  141.    // N zeigt auf einen Knoten
  142.    Node *N;
  143.  
  144.    // einen neuen Knoten erzeugen
  145.    N = new Node;
  146.  
  147.    // Zeiger auf das Objekt im Knoten speichern
  148.    N->Item = NewItem;
  149.  
  150.    // nächster Eintrag zeigt auf akt. Listenposition
  151.    N->Next = Nodes;
  152.  
  153.    // letzter Eintrag zeigt nun auf diesen Knoten
  154.    Nodes = N;
  155.  
  156. }
  157.  
  158. void List::Report()
  159. {
  160.    char TempString[12];
  161.    Node *Current = Nodes;
  162.    while (Current != NULL)
  163.    {
  164.       // X-Wert des Eintrags des aktuellen Knotens
  165.       //  lesen und in einen String konvertieren
  166.       itoa(Current->Item->GetX(), TempString, 10);
  167.       outtext("X = ");
  168.       OutTextLn(TempString);
  169.  
  170.       // das gleiche für den Y-Wert
  171.       itoa(Current->Item->GetY(), TempString, 10);
  172.       outtext("Y = ");
  173.       OutTextLn(TempString);
  174.  
  175.       // auf den nächsten Knoten zeigen
  176.       Current = Current->Next;
  177.    };
  178. }
  179.  
  180. void setlist(void);
  181.  
  182. main()     // Funktionen testen
  183. {
  184.    int graphdriver = DETECT, graphmode;
  185.    initgraph(&graphdriver, &graphmode,
  186.              "..\\bgi");
  187.  
  188.    MemStatus("Speicher freigeben, bevor die "
  189.              "Liste initialisiert wird: ");
  190.    setlist();
  191.    MemStatus("Speicher freigeben nach "
  192.              "List-Destruktor: ");
  193.    getch();
  194.    closegraph();
  195. }
  196.  
  197. void setlist() {
  198.  
  199.    // eine Liste deklarieren
  200.    //  (ruft den List-Konstruktor auf)
  201.    List AList;
  202.  
  203.    // einige Figuren erzeugen und in die
  204.    //  Liste aufnehmen
  205.    Arc *Arc1 = new Arc(151, 82, 25, 200, 330);
  206.    AList.Add(Arc1);
  207.    MemStatus("Speicher freigeben nach Zufügen "
  208.              "von arc1: ");
  209.  
  210.    Circle *Circle1 = new Circle(200, 80, 40);
  211.    AList.Add(Circle1);
  212.    MemStatus("Speicher freigeben nach Zufügen "
  213.              "von circle1: ");
  214.  
  215.    Circle *Circle2 = new Circle(305, 136, 35);
  216.    AList.Add(Circle2);
  217.    MemStatus("Speicher freigeben nach Zufügen "
  218.              "von circle2: ");
  219.  
  220.    // Liste durchgehen und X-Y-Werte der
  221.    //  Figuren zeigen
  222.    AList.Report();
  223.  
  224.    /* Die 3 Alist-Knoten und die Objekte Arc und
  225.       Circle werden von ihren Destruktoren
  226.       automatisch freigegeben, wenn sie nicht
  227.       mehr im Gültigkeitsbereich von main() sind.
  228.       Arc und Circle benutzen implizit Destruktoren
  229.       im Gegensatz zum expliziten ~List-Destruktor.
  230.       Sie können hier aber auch explizit löschen,
  231.       wenn Sie das wünschen:
  232.  
  233.       delete Arc1; delete Circle1; delete Circle2;
  234.    */
  235.  
  236.    getch();   // auf einen Tastendruck warten
  237.    return;
  238. }