AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi typisierten Pointer abgeleiteter Klasse Basisklasse zuweisen
Thema durchsuchen
Ansicht
Themen-Optionen

typisierten Pointer abgeleiteter Klasse Basisklasse zuweisen

Ein Thema von Looper · begonnen am 4. Feb 2010 · letzter Beitrag vom 5. Feb 2010
Antwort Antwort
Seite 1 von 2  1 2      
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#1

typisierten Pointer abgeleiteter Klasse Basisklasse zuweisen

  Alt 4. Feb 2010, 20:34
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 4. Feb 2010, 20:46
Klassenreferenzen sind bereits Zeiger. Zudem würde ich andersrum verfahren: Nimm Referenzen auf die Basisklasse, dann kannst du damit auch Subklassen referenzieren.
Markus Kinzler
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#3

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 20:29
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 20:38
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#5

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 20:45
Ah okay, danke
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?
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 20:54
Zitat:
Nur als Verständnisfrage.. Könnte man jetzt über Obj1 auf Felder von SubObj1 zugreifen.
Wenn du das Objekt entsprechend castest:
(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
Markus Kinzler
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#7

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 20:59
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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 21:02
Wir schliessen Threads normalerweise nie
Markus Kinzler
  Mit Zitat antworten Zitat
Looper

Registriert seit: 28. Sep 2007
Ort: Hamburg
131 Beiträge
 
Delphi XE2 Professional
 
#9

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 21:27
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
  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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.861 Beiträge
 
Delphi 11 Alexandria
 
#10

Re: typisierten Pointer abgeleiteter Klasse Basisklasse zuwe

  Alt 5. Feb 2010, 21:34
Jein. Auch bei expliziten Zeigern verzeiht Delphi das Weglassen von ^
Markus Kinzler
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:51 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