![]() |
Wert eines Zeigers einem anderen Zeiger zuweisen
Hi Leute, hab mal wieder ein für mich sehr unverständliches Verhalten von delphi zu beafragen:
Also ich hab ne Klasse die heißt TMyClass und 2 Zeiger auf Objekte der Klasse: o_1 : ^TMyClass; o_2 : ^TMyClass; Nun weißt ich dem ersten Zeiger die Adresse mittels o_1 := @TMyClass.create(); zu, was soweit auch funktioniert. In o_2 möchte ich nun auch gerne diese Adresse haben, was ich mittels o_1 := o_2; probiere und was mir völlig logisch erscheint! Delphi meldet jedoch: Incompatible Typen ????? |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
Hast Du mal versucht, die Definition so zu schreiben:
type PMyClass = ^TMyClass; o_1 : PMyClass; o_2 : PMyClass; |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
wieso willst du da Zeiger verwenden?
Objekte sind doch schon Zeiger und so (wie du es machen willst), würdest du dann die Zeiger auf die Variable und nicht auf das Object übertragen.
Delphi-Quellcode:
Var o_1: TMyClass;
o_2 : TMyClass; o_1 = o_2; |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
seit wann sind objekte (instanzen) zeiger ??
also wenn ich eine variable vom typ TMyClass deklariere o_1 : TMyClass dann kann ich doch davon ausgehen, dass o_1 somit vom typ TMyClass ist und nicht ein Zeiger. Sorry ich komm aus der C++ - Welt, deshalb versteh ich vielleicht nur bahnhof |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
schon immer
die Objekt-Variable ist intern nur ein Pointer, welcher auf den Speicher der Objektinstanz zeigt. (bei .Create wird der Speicher der Objectinstanz reserviert und diesem Zeiger zugewießen) das beweißt zwar nichts, aber glaubst du ein riesiges Object paßt in 4 Byte rein? Zitat:
|
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
dann versteh ich nicht, warum ich direkt ohne Derefferenzierung so etwas machen kann:
o_1 : TMyClass; o_1 := TMyClass.create(); o_1.attrib := 33; Rein logisch (und objektorientiert) gedacht, würde ich damit eine eigenschaft eines Zeigers ansprechen, die es für mich nicht gibt. somit müsste es demnach heißen o_1^.attrib := 33; oder nimmt delphi hier in irgendeiner art und weise eine selbständige derefferenzierung vor ? so nach dem motto: "die leute sind zu dumm um zeigerarithmetik zu verstehen, deshalb machen wir es noch unlogischer" ??? |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
Das ist ein für- und wieder. Was meinst Du wie der Quelltext aussehen würde wenn Du bei allem, was Pointer ist, das explizit ansprechen musst. Nimm zum Beispiel Java, da werden alle intern gebrauchten Pointer verdeckt. Das empfinde ich als durchaus angenehm. Krasses Gegenteil: C, da wird das mit den Objekten soweit ich weiß, auch so gemacht wie Du Dir das vorstellst . Dass Delphi so ein Mischung daraus macht, finde ich selbst auch nicht so sehr angenehm, wird allerdings darauf zurückzuführen sein, dass man eine relativ alte Programmiersprache an neue Entwicklungen anpassen will/muss.
|
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
Nunja, eine gute Programiersprache zeichnet sich für mich im wesentlichen dadurch aus, dass sie eine einheitliche Struktur verfolgt.
Das ist einen Pointer auf der einen Seite wie ein Objekt behandeln muss und auf der anderen Seite wie einen Zeiger, sprich deutlich gegen mein Verständnis von logik. Das ganze Konzept von C was du ansprichst bzw. C++ scheint ein bischen Gehirnschmalz zu kosten, um es zu verstehen, jedoch ist es einheitlich und eindeutig! Nunja, anscheinend bleibt mir nichts anderes übrig als es so zu akzeptieren wie es ist.... |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
Nun, ich würde vom reinen Umgang her die Art von Java bevorzugen. Allerdings bin ich beruflich an Delphi gebunden...
Letztlich gibt es dazu wohl so viele Meinungen wie Programmiersprachen... |
Re: Wert eines Zeigers einem anderen Zeiger zuweisen
Objecte werden delphiintern dereferenziert.
Delphi-Quellcode:
bei Pointern wird auch automatisch dereverenziert (falls nötig)
type TMyRec = record
X: Integer; end; PMyRec = ^TMyRec; Var R: PMyRec; R^.X := 123; R.X := 123; - bei Objekten kann aber nicht per ^ manuell dereferenziert werden - und bei Pointern wird es (seit 'ner Weile), als unsicher angesehn ( R^ = OK ... R^.X = hier kommt 'nen Hinweis ... R.X = gern gesehn ... wobei ich es hier blöd find, da ich eigentlich, wegen der Übersicht, lieber weiterhin R^.X gemacht hätte :cry: ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:37 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