Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi typisierten Pointer abgeleiteter Klasse Basisklasse zuweisen (https://www.delphipraxis.net/147266-typisierten-pointer-abgeleiteter-klasse-basisklasse-zuweisen.html)

Looper 4. Feb 2010 19:34


typisierten Pointer abgeleiteter Klasse Basisklasse zuweisen
 
Guten abend,
ich bin gerade ein bischen ratlos bei meinem kleinen Schulprojekt. Und zwar möchte ich eine einfach verkettete Liste darstellen und versuche gerade C++ Quellcode aus einem Buch zu übersetzen. Und nun zum Problem:

Es gibt die Klassen Knoten (Basisklasse), Anfangsknoten(abgeleitet), und Endknoten(auch abgeleitet von Basisklasse). nun steht im C++ Code folgendes
Code:
Knoten* next;
[...]
next = new Endknoten;
Wenn ich das 1 zu 1 in Delphi übertrage, kommt es unweigerlich zu einer Fehlermeldung schon zur Entwurfszeit. Ich habe das so umgeschrieben:
Delphi-Quellcode:
Next : PKnoten;
[...]
Next := PKnoten(New(PEndKnoten));
Next^ := TEndKnoten.Create(LB);
Das einzige was ich mir vorstellen könnte ist, dass ich New als Parameter nicht dem Pointertyp, sondern den Klassentyp (TEndKnoten) übergebe, aber von der Größe tut sich da sowieso nix sizeof(PEndKnoten)=sizeof(TEndKnoten)...

Meine erste Frage ist, ob meine Delphilösung fehlerhaft ist. Denn zur Laufzeit kommen typische Fehlerzugriffe-Meldungen...

Schönen abend noch, Grüße Janek

mkinzler 4. Feb 2010 19:46

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Klassenreferenzen sind bereits Zeiger. Zudem würde ich andersrum verfahren: Nimm Referenzen auf die Basisklasse, dann kannst du damit auch Subklassen referenzieren.

Looper 5. Feb 2010 19:29

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Schon mal danke für die Antwort mKinzler, aber irgendwie werde ich daraus noch nicht ganz schlau...
Also Subklasse = abgeleitete Klasse?

Und dann soll ich das so schreiben?
Delphi-Quellcode:
var
  Next : PKnoten;  //Referenz auf die Basisklasse
begin
  Next := new(PKnoten); //oder jetzt doch die "richtige" Klasse TKnoten
end;
So hab ich ja eine Referenz auf die Basisklasse erstellt, doch wie kann ich damit auf die abgeleiteten Klassen referenzieren? Klar mit dem ^Operator, aber wie wende ich den an?

Grüße Janek

mkinzler 5. Feb 2010 19:38

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Bei Klassen brauchst du keine Zeiger, das die "Variablen" ja Referenzen(Zeiger) auf die Objekte sind.

Delphi-Quellcode:
type
  TMeineBasisklasse = class
  private
     ...
  public
     ...
  ...
  end;

  Subklasse1 = class( TMeineBasisKlasse)
  private
      ...
  ...
  end;

...
var

  Obj1: TMeineBasisKlasse; //Referenz auf Basisklasse
  SubObj1: TSubKlasse; //Referenz auf Subobjekt

...
  SubObj1 := TSubKlasse.Create;
  Obj1 := SubObj1; // Referenz auf Basisklasse kann Objekt der Subklasse referenzieren
Da eine IS-A Beziehung zwischen abgeleiteter Klasse und ihrer (oder einer) Basisklassen besteht, kann eine Objekt einer Subklasse immer wie ein Objekt der Basisklasse verwendet werden.

Looper 5. Feb 2010 19:45

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Ah okay, danke :-D
Nur als Verständnisfrage.. Könnte man jetzt über Obj1 auf Felder von SubObj1 zugreifen.
Delphi-Quellcode:
//Fall 1:
  Obj1.FeldAusSubklasse1 := 1;
//Fall 2:
  SubKlasse1(Obj1).FeldAusSubklasse1 := 1
Bei Fall 1 sollte doch der Compiler gleich den Fehler bemerken, während es dann bei Fall 2 zu einem Laufzeitfehler führen müsste oder sehe ich das falsch?

mkinzler 5. Feb 2010 19:54

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Zitat:

Nur als Verständnisfrage.. Könnte man jetzt über Obj1 auf Felder von SubObj1 zugreifen.
Wenn du das Objekt entsprechend castest:
Delphi-Quellcode:
(Obj1 as TSubKlasse).<Eigenschaft von Subklasse>
Zitat:

Bei Fall 1 sollte doch der Compiler gleich den Fehler bemerken,
Ja
Zitat:

während es dann bei Fall 2 zu einem Laufzeitfehler führen müsste oder sehe ich das falsch?
Nur wenn Obj1 nicht vom Typ TSubKlasse ist. deshalb ist ein SoftCast ( as ) besser

Looper 5. Feb 2010 19:59

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Okay. Ich probier das gleich mal aus. Dann kann man sich 100%ig sicher sein alles verstanden zu haben.

Vielen Dank für die Hilfe und noch einen schönen abend. Aber bitte noch nicht schließen; vielleicht kommt noch eine Frage in den nächsten 2 Tagen.

mkinzler 5. Feb 2010 20:02

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Wir schliessen Threads normalerweise nie

Looper 5. Feb 2010 20:27

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Super. Funktioniert alles!
Es handelt sich also direkt um Referenzen, wie du bereits sagtest. Und wenn ich nun als unwissender Programmierer versuche folgende Zuweisung zu realisieren
Delphi-Quellcode:
  Obj1 := ^SubObj1;
kommt es natürlich beim Soft Cast zur ungültigen Typumwandlung. Ist das die immer gelobte Verbergung von Zeigern in Delphi, die man als kleiner Programmierer nie bemerkt?
Ist ja schön, dass ich die auch endlich mal gesehen/verstanden habe :-D

mkinzler 5. Feb 2010 20:34

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
 
Jein. Auch bei expliziten Zeigern verzeiht Delphi das Weglassen von ^


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:31 Uhr.
Seite 1 von 2  1 2      

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