Der fundamentale Fehler schlechthin ist die Sache mit den globalen Variablen
Nach und
Anzahl. Anzahl gehört eigentlich zum Gedächtnis deines Kunden-Objektes. Mit dem Verweis auf den Nachfolger ist das allerdings so eine Sache. Der Grad der Entkopplung deiner Klassen bestimmt wo dieser Verweis unterzubringen ist.
Denkbar sind folgende Ansätze:
(1) Deine Queue ist spezifisch und kann nur Objekte einer bestimmten Klasse verwalten.
(2) Deine Queue ist generisch und kann Objekte einer beliebigen Klasse verwalten.
(2.1) Die Klasse TKunde ist Nachfahre einer speziellen Klasse TQueueItem.
(2.2) Die Klasse TQueueItem enthält einen Verweis auf ein Kunden-Objekt.
Ich favorisiere Ansatz (2) und bei deiner Aufgabe dürften die beiden dort unterschiedenen Varianten beide problemlos umsetzbar sein.
Delphi-Quellcode:
// Variante (2.1)
type
TQueueItem = class
private
FNext: TQueueItem;
public
property Next: TQueueItem read FNext write FNext;
end;
TKunde = class(TQueueItem)
private
FAnzahl: integer;
public
constructor Create(anzahl: integer);
procedure Auflegen; // Einen Artikel zum Erfassen geben
property Anzahl: integer read FAnzahl; // write nur intern
property Naechster: TKunde read FNext;
end;
Delphi-Quellcode:
// Variante (2.2)
type
TQueueItem = class
private
FNext: TQueueItem;
FData: TObject;
public
consturctor Create(data: TObject);
property Data: TObject read FData;
property Next: TQueueItem read FNext write FNext;
end;
TKunde = class
private
FAnzahl: integer;
public
constructor Create(anzahl: integer);
procedure Auflegen; // Einen Artikel zum Erfassen geben
property Anzahl: integer read FAnzahl; // write nur intern
end;
Früher oder später solltest du dir angewöhnen abstrakte Klassen (Queue) und solche aus deinem Aufgabenfeld (Kunde, Kasse) voneinander zu trennen. Hier noch ein Code-Schnippsel für TQueue:
Delphi-Quellcode:
TQueue = class
private
FHead: TQueueItem;
FTail: TQueueItem;
public
function Add(qi: TQueueItem): TQueueItem;
function Remove: TQueueItem;
property Head: TQueueItem read FHead;
end;
Ein anderer Fehler ist deine Verwendung von Randomize(). Diese Prozedur dient eigentlich dazu dem Pseudo-Zufallszahlen-Generator einen bestimmten Seed-Wert zu verpassen, damit er eine reproduzierbare Folge von Zufallszahlen erzeugt. Brauchst du eigentlich nicht wirklich - schon gar nicht im Konstruktor deiner Kunden-Klasse.
Bevor ich deine Hausaufgaben jetzt ganz erledige warte ich lieber mal darauf, was du so zu Stande bringst.
marabu