Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Fragen zur Zentralabituraufgabe 2007 (https://www.delphipraxis.net/125396-fragen-zur-zentralabituraufgabe-2007-a.html)

rand 5. Dez 2008 10:20


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:

Prüfungsaufgabe GK 1 Delphi (Aufgabe)

Unterlagen für die Lehrkraft GK 1 Delphi (Musterlösung)

Delphi-Quellcode:
{ 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;
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)?

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:
type
  TXY = class(TObject)
    public
      x : integer;
  end;
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?

MfG rand

mashutu 5. Dez 2008 10:41

Re: Fragen zur Zentralabituraufgabe 2007
 
Zitat:

Zitat von rand
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)?

Einerseits handelt es sich um Zeiger (typisierte Zeiger) und andererseits ist es - wie der Name sagt - eine Musterloesung. Das kann man auch auf zig andere Arten implementieren.

Zitat:

Zitat von rand
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?

Das Object (mit dem Inhalt) muss ohnehin kopiert werden. Ob Du

new(p);
p^:=TNode.create()

machst - oder ein den Zeiger weglaesst ist insofern dasselbe.

Zitat:

Zitat von rand
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?

Na, wenn Du alle Objekte von Tobject ableitest, dann kannst Du auch all diese Objekte an die Methode enqueue uebergeben - ohne dass der Compiler meckert.

(Sauberer waere es aber einen Vorfahr QueueElement zu nehmen.)
Zitat:

Zitat von rand
Dieselbe Fragestellung an einem Beispiel:

TXY von TObject ableiten:

Delphi-Quellcode:
type
  TXY = class(TObject)
    public
      x : integer;
  end;
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?

Machst Du einen Typecast, dann geht das. Das muesstest Du mit einem Pointer auch machen. Denn der Pointer hat ja auch keine Property x:integer;

Daher waere es eben sinnvoll einen Vorfahr "QueueElement" zu deklarieren, der ueber die wichtigsten properties verfuegt.

Tyrael Y. 5. Dez 2008 10:43

Re: Fragen zur Zentralabituraufgabe 2007
 
Jedes Objekt ist ein Zeiger.

Wenn du in eine Methode ein Objekt von TMeineSuperklasse hineingibst...

Delphi-Quellcode:
...
procedure TuWasTolles(Object: TObject)
begin
...
end;
...

var
  meinObjekt: TMeineSuperklasse;
  ...
begin
...
   TuWasTolles(meinObjekt);
...
end;
...sind alle Informationen deiner Klasse immer noch da, da du nur einen Zeiger übergeben hast.

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;

mirage228 5. Dez 2008 10:53

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

rand 5. Dez 2008 11:19

Re: Fragen zur Zentralabituraufgabe 2007
 
Zitat:

(mashutu)Einerseits handelt es sich um Zeiger (typisierte Zeiger)
Zitat:

(Tyrael Y.)Jedes Objekt ist ein Zeiger.
Das heißt, var xy : TObject ist eigentlich ein Zeiger auf ein TObject? Wieso wird das dann nicht durch ein PObject kenntlich gemacht?

Sind auch Datentypen (integer, string, ...) Objekte (in Delphi)?

Zitat:

(mashutu)Das Object (mit dem Inhalt) muss ohnehin kopiert werden. Ob Du

new(p);
p^:=TNode.create()

machst - oder ein den Zeiger weglaesst ist insofern dasselbe.
Ich meine nicht das TNode-Objekt, sondern das TObject-Objekt: Man muss es erstellen, dann übergibt man es TQueue.enqueue (1 mal kopiert), dann wird es in enqueue nochmal dem Konstruktor von TNode übergeben (2 mal kopiert). Aber wenn es sowieso ein Zeiger ist...

Zitat:

(mirage228)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.
Ja, aber es war ja vorgegeben, dass TQueue.enqueue einen Parameter vom Typ TObject hat.

P.S.: Zu Delphis Zeigern: Ist

Delphi-Quellcode:
procedure x(var a : TX);
begin
  a.setXY(1);
end;
dasselbe wie

Delphi-Quellcode:
type PX = ^TX;
procedure y(a : PX)
begin
  a^.setXY(1);
end;
?

mfg rand

OregonGhost 5. Dez 2008 11:24

Re: Fragen zur Zentralabituraufgabe 2007
 
Zitat:

Zitat von rand
Das heißt, var xy : TObject ist eigentlich ein Zeiger auf ein TObject? Wieso wird das dann nicht durch ein PObject kenntlich gemacht?

Na, weil Objekte doch immer Zeiger (oder vielmehr Referenzen) sind. Was willst du da noch extra kenntlich machen? In C++ sind diese Dinge immer explizit, Delphi hingegen versteckt eine Menge davon vor dir.

Tyrael Y. 5. Dez 2008 11:32

Re: Fragen zur Zentralabituraufgabe 2007
 
Zitat:

Zitat von rand

P.S.: Zu Delphis Zeigern: Ist

Delphi-Quellcode:
procedure x(var a : TX);
begin
  a.setXY(1);
end;
dasselbe wie

Delphi-Quellcode:
type PX = ^TX;
procedure y(a : PX)
begin
  a^.setXY(1);
end;
?

Beim ersten übergibst du das Objekt selbst, also den Zeiger(Startadresse des Objektes).

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 19:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz