Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Verständnisschwierigkeiten bei Variablen
Beppo - Di 20.03.07 11:03
Titel: Verständnisschwierigkeiten bei Variablen
Hallo,
ich habe leichte Verständnisprobleme was Variablen und Objektbezeichner betrifft :-( Dazu ein kleines Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var: meinAuto1 : Auto; aktivesAuto: Auto;
...
meinAuto1 :=Auto.create; meinAuto.init(...);
aktivesAuto := meinAuto1; |
Wann wird Speicherplatz für das Objekt meinAuto1 reserviert? Schon bei der Deklaration oder erst bei der Initialisierung?
Wird Speicherplatz für die Variable aktivesAuto reserviert?
AktivesAuto ist eine Referenz. Also ein Objektbezeichner?
Kann ich AktivesAuto als eine Variable auffassen?
Kann man nur anhand der Deklaration erkennen, ob es sich bei einer Variable um eine Refernz handelt?
Ich habe das Gefühl, dass viele durcheinander schmeiße...
Hoffe Ihr könnt mir weiterhelfen.
Vorab vielen Dank für Eure Mühen!!!
Markus
Kroko - Di 20.03.07 11:14
(a) Typen beginnen mit einem T
also
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| Var: meinAuto1: TAuto; aktivesAuto: TAuto;
...
meinAuto1 := TAuto.create; meinAuto.init(...);
aktivesAuto := meinAuto1; |
(b) das Objekt/die Klasse wird bei Create angelegt und der Speicher reserviert!
Ralf Jansen - Di 20.03.07 11:36
Titel: Re: Verständnisschwierigkeiten bei Variablen
Delphi-Quelltext
1: 2: 3:
| Var: meinAuto1 : Auto; aktivesAuto: Auto; |
Gehen wir von einem 32bit System aus dann wird hier für beide Referenzen 4Byte Speicher reserviert.
Delphi-Quelltext
1: 2:
| meinAuto1 :=Auto.create; meinAuto.init(...); |
Jetzt wird Speicher für ein Auto-Objekt erzeugt und die Adresse wo der Speicher liegt in die 4Byte von meinAuto1 geschrieben.
Delphi-Quelltext
1:
| aktivesAuto := meinAuto1; |
und nun wird der Inhalt von meinAuto1 in aktivesAuto kopiert also die 4Byte mit der Adresse auf das erzeugte Auto Objekt.
Beide Referenzen zeigen also auf den selben Speicher und damit auf das selbe Auto Objekt.
Zitat: |
AktivesAuto ist eine Referenz. Also ein Objektbezeichner?
Kann ich AktivesAuto als eine Variable auffassen?
Kann man nur anhand der Deklaration erkennen, ob es sich bei einer Variable um eine Refernz handelt?
|
Referenzen sind Variablen. Ob eine Variable eine Referenz ist erkennst du am Typ der Variablen.
Auf dein Codebeispiel bezogen. meinAuto1 und aktivesAuto sind beides Referenzen und im Code nicht unterscheidbar.
Ich vermute mal (wäre ein klassisches Problem) du fragst dich wie das Auto Objekt sauber zu zerstören ist wenn es mehr als eine Referenz gibt. Da gibt es verschiedenste Lösungen die unter so Begriffen wie 'intelligente Pointer','Referenzzählung' usw. laufen. Werf mal die Suchmachine deiner Wahl an. Da ist reichlich Material zu finden.
Gruß
Ralf
freak4fun - Di 20.03.07 11:39
Kroko hat folgendes geschrieben: |
(a) Typen beginnen mit einem T |
Nein, nicht zwingend. Das sind Coderichtlinien. Wenn seine Klasse Auto heißt kann er es so machen, auch wenn es unschön ist.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| type Auto = class ...
End;
var FAuto: Auto;
... |
MfG
freak
Beppo - Di 20.03.07 12:01
Danke für die schnelle AW. Die Fragen bzgl. Speicher haben sich nun geklärt. Danke!
Doch jetzt drängt sich mir eine weitere Frage auf.
Was ist eine Variable die keine Referenz ist? Wie erkenne ich diese?
Sind damit nur die klassischen Datentypen int, double, boolean,... gemeint?
VG
Markus
UGrohne - Di 20.03.07 12:11
Ja, das sind Wertetypen. Im Gegensatz zu C# beispielsweise gibt es in Delphi solche Sachen noch. Diese kannst Du nicht erzeugen, mittels
integer.Create().
Aber Du kannst auch diese als Referenzen haben, mittels Pointer
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| var Int: Integer; PInt: ^integer; begin int := 3; PInt := @int; ShowMessage(IntToStr(^PInt)); end; |
Das war jetzt aus dem Kopf niedergeschrieben, ich hoffe, das stimmt so. Ich muss da auch immer etwas experimentieren, weil ich das nicht oft brauche (nur beispielsweise beim TreeView).
Kroko - Di 20.03.07 12:37
freak4fun hat folgendes geschrieben: |
Kroko hat folgendes geschrieben: | (a) Typen beginnen mit einem T |
Nein, nicht zwingend. Das sind Coderichtlinien. Wenn seine Klasse Auto heißt kann er es so machen, auch wenn es unschön ist.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| type Auto = class ...
End;
var FAuto: Auto;
... |
MfG
freak |
PS: ers sieht selber schon nicht mehr durch und ein paar Coderichtlinien täten da gut! :lol:
freak4fun - Di 20.03.07 12:43
Kroko hat folgendes geschrieben: |
PS: ers sieht selber schon nicht mehr durch und ein paar Coderichtlinien täten da gut! :lol: |
Absolut! :zustimm: Also Beppo: Coderichtlinien anschauen! ;)
MfG
freak
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!