Autor Beitrag
Beppo
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 20.03.07 11:03 
Hallo,

ich habe leichte Verständnisprobleme was Variablen und Objektbezeichner betrifft :-( Dazu ein kleines Beispiel:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 20.03.07 11:14 
(a) Typen beginnen mit einem T
also
ausblenden 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!

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Di 20.03.07 11:36 
ausblenden 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.

ausblenden 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 20.03.07 11:39 
user profile iconKroko 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.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
type
  Auto = class ...

  End;

var
  FAuto: Auto;

...


MfG
freak

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen
Beppo Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: 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?

ausblenden Delphi-Quelltext
1:
2:
x: int;
x:=3;



VG


Markus
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: 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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1284

W98 W2k WXP
Turbo D
BeitragVerfasst: Di 20.03.07 12:37 
user profile iconfreak4fun hat folgendes geschrieben:
user profile iconKroko 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.

ausblenden 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:

_________________
Die F1-Taste steht nicht unter Naturschutz und darf somit regelmäßig und oft benutzt werden! oder Wer lesen kann, ist klar im Vorteil!
freak4fun
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 604
Erhaltene Danke: 4

Win 7 Pro
VS 2013 Express, Delphi, C#, PHP, Java
BeitragVerfasst: Di 20.03.07 12:43 
user profile iconKroko 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

_________________
"Ich werde auf GAR KEINEN Fall…!" - "Keks?" - "Okay, ich tu's."
i++; // zaehler i um 1 erhoehen