![]() |
Fragen zur Zentralabituraufgabe 2007
Hallo!
Ich habe eine Frage zur Abituraufgabe. Dort soll eine Warteschlange mit Delphi realisiert werden. Wie eine Warteschlange funktioniert weiß ich und Konzepte der OOP kenne ich auch (von C++), jedoch nicht (sehr gut) in Delphi. Hier die Aufgabe + Musterlösung: ![]() ![]()
Delphi-Quellcode:
1. Ich verstehe hierbei nicht, warum keine Zeiger verwendet werden (z.B. hTail.setNext(xy) setzt ja in dieser Prozedur einen TNode und keinen Zeiger auf einen TNode). Ist das nicht viel zu langsam und auch nicht ein wenig verwirrend bei einer Warteschlange (die ja fast wie eine Liste ist)?
{ Aus der Musterlösung: }
procedure TQueue.enqueue (pObject: TObject); var lNewNode:TNode; begin lNewNode:=TNode.create(pObject,nil); if self.isEmpty then begin hHead:=lNewNode; hTail:=lNewNode; end else begin hTail.setNext(lNewNode); hTail:=lNewNode; end; end; 2. Der Prozedur TQueue.enqueue wird ja ein Parameter vom Typ TObject übergeben. Warum ist das wieder kein Zeiger? Es muss doch bei TNode.create(...) wieder kopiert werden, oder nicht? Steht der Präfix "p" (von pObject) nicht für Pointer? 3. Vererbung, Polymorphie und andere OOP-Konzepte kenne ich aus C++. Soweit wie ich die Klasse TQueue verstanden habe, soll zur Benutzung der Klasse ja ein TObject der Methode enqueue übergeben werden. Wie kann ich jetzt eigene Datenstrukturen übergeben bzw. wie kann ich die speziellen Eigenschaften meiner Klasse dann in enqueue (oder anderen Methoden von TQueue) verwenden? Dieselbe Fragestellung an einem Beispiel: TXY von TObject ableiten:
Delphi-Quellcode:
Ich kann ja ein Objekt der Klasse TXY an TQueue.enqueue übergeben, doch da ja nirgendwo mit Zeigern gearbeitet wird, wie soll man bitteschön in der Methode enqueue (oder irgendeiner anderen) dann auf den Integer x der Klasse zugreifen? Es wird doch nur der Basisklassenanteil kopiert oder sehe ich das falsch?
type
TXY = class(TObject) public x : integer; end; MfG rand |
Re: Fragen zur Zentralabituraufgabe 2007
Zitat:
Zitat:
new(p); p^:=TNode.create() machst - oder ein den Zeiger weglaesst ist insofern dasselbe. Zitat:
(Sauberer waere es aber einen Vorfahr QueueElement zu nehmen.) Zitat:
Daher waere es eben sinnvoll einen Vorfahr "QueueElement" zu deklarieren, der ueber die wichtigsten properties verfuegt. |
Re: Fragen zur Zentralabituraufgabe 2007
Jedes Objekt ist ein Zeiger.
Wenn du in eine Methode ein Objekt von TMeineSuperklasse hineingibst...
Delphi-Quellcode:
...sind alle Informationen deiner Klasse immer noch da, da du nur einen Zeiger übergeben hast.
...
procedure TuWasTolles(Object: TObject) begin ... end; ... var meinObjekt: TMeineSuperklasse; ... begin ... TuWasTolles(meinObjekt); ... end; Wenn du innerhlab von TuWasTolles etwas von deiner Klasse ausführen möchtest musst du es dann vorher casten.
Delphi-Quellcode:
procedure TuWasTolles(Object: TObject)
begin ... TMeineSuperklasse(Object).DiesIstNeSuperMethode(); ... end; |
Re: Fragen zur Zentralabituraufgabe 2007
Hey cool, die Klausur habe ich sogar geschrieben :mrgreen: ...
Ich weiß leider nicht mehr wie ich das genau gelöst habe, aber wie schon gesagt wurde, musst es nicht so wie in der Musterlösung implementieren (habe ich auch nicht), hauptsache deine Methoden leisten das geforderte. Viele Grüße |
Re: Fragen zur Zentralabituraufgabe 2007
Zitat:
Zitat:
Sind auch Datentypen (integer, string, ...) Objekte (in Delphi)? Zitat:
Zitat:
P.S.: Zu Delphis Zeigern: Ist
Delphi-Quellcode:
dasselbe wie
procedure x(var a : TX);
begin a.setXY(1); end;
Delphi-Quellcode:
?
type PX = ^TX;
procedure y(a : PX) begin a^.setXY(1); end; mfg rand |
Re: Fragen zur Zentralabituraufgabe 2007
Zitat:
|
Re: Fragen zur Zentralabituraufgabe 2007
Zitat:
Beim zweiten übergibst du einen Zeiger auf das Objekt, also einen Zeiger auf die Startadresse des Objektes. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz