![]() |
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:
Wenn ich das 1 zu 1 in Delphi übertrage, kommt es unweigerlich zu einer Fehlermeldung schon zur Entwurfszeit. Ich habe das so umgeschrieben:
Knoten* next;
[...] next = new Endknoten;
Delphi-Quellcode:
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)...
Next : PKnoten;
[...] Next := PKnoten(New(PEndKnoten)); Next^ := TEndKnoten.Create(LB); Meine erste Frage ist, ob meine Delphilösung fehlerhaft ist. Denn zur Laufzeit kommen typische Fehlerzugriffe-Meldungen... Schönen abend noch, Grüße Janek |
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.
|
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:
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?
var
Next : PKnoten; //Referenz auf die Basisklasse begin Next := new(PKnoten); //oder jetzt doch die "richtige" Klasse TKnoten end; Grüße Janek |
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:
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.
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 |
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:
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?
//Fall 1:
Obj1.FeldAusSubklasse1 := 1; //Fall 2: SubKlasse1(Obj1).FeldAusSubklasse1 := 1 |
Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
Zitat:
Delphi-Quellcode:
(Obj1 as TSubKlasse).<Eigenschaft von Subklasse>
Zitat:
Zitat:
|
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. |
Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe
Wir schliessen Threads normalerweise nie
|
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:
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?
Obj1 := ^SubObj1;
Ist ja schön, dass ich die auch endlich mal gesehen/verstanden habe :-D |
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 13:32 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 by Thomas Breitkreuz