Einzelnen Beitrag anzeigen

4dk2

Registriert seit: 4. Sep 2007
176 Beiträge
 
#1

[XE3] Operator Overloading, Verhalten?

  Alt 20. Mär 2014, 14:57
Delphi-Version: XE3
Moin,

Vorhin zum ersten mal mit Delphi und Operator Overloading beschäftigt.
Von C++ kenn ich es schon.
Das Delphi das seit Delphi2006 schon kann war mir neu.

Bin vorhin erstmal auf die Nase gefallen.
Ich dachte mir schön, dann leg ich jetzt mal nen eigenen Typ an
und hinterlege da einen Wert + Verknüpfung auf ein Objekt.

Hab dann die Variable lokal angelegt, und einfach mit
v.object := irgendwas;
und
v:=100;
initialisiert.

Das klappt auch.
ABER! wenn v ein feld einer klasse ist oder im globalen Teil steht,
wird bei v:=100 das record neu initialisiert. Also der Pointer auf das Objekt ist dann nil.
Interessanter weise bei lokalen variablen nicht. Auch nicht bei Release...

Gut man kann das verhalten schnell korrigieren indem man alle Felder vom Record im class operator implict
initialisiert...

Aber ich hätte das Verhalten gerne.

Also ich möchte am liebsten dem Record beim Anfang ein Objekt oder zweiten wert mitgeben, den
es bei einer Operator Zuweisung behält (v:=100)
Ist denke ich aber nicht möglich oder?

Hier das Beispiel:

Delphi-Quellcode:
unit Unit2;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TVarX = record
    Value: integer;
    FormMaster: TForm;
    Name: string;
    class operator implicit(const z: integer): TVarX; // bei TvarX:=int
  end;

  TForm2 = class(TForm)
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
  private
    FormVar1: TVarX;
    { Private-Deklarationen }
    procedure TestX;
  public
    { Public-Deklarationen }
  end;

var
  Form2: TForm2;
  globalVar1: TVarX;

implementation

{$R *.dfm}
{ TVarX }

class operator TVarX.implicit(const z: integer): TVarX;
begin
  result.Value := z;
end;

{ TForm2 }

procedure TForm2.TestX;
var
  localVar1: TVarX;
begin
  localVar1 := 100;
  localVar1.Name := 'blubblub';
  localVar1.FormMaster := self;

  localVar1 := 200; { value = 200, name = 'blubblub', formMaster=form2 }

  FormVar1 := 100;
  FormVar1.Name := 'blubblub';
  FormVar1.FormMaster := self;

  FormVar1 := 200; { value = 200, name = '', formMaster=nil }

  globalVar1 := 100;
  globalVar1.Name := 'blubblub';
  globalVar1.FormMaster := self;

  globalVar1 := 200; { value = 200, name = '', formMaster=nil }



  //zum testn bei build release...
  Memo1.Lines.Add('localVar1.Name' + ' : ' + localVar1.Name); //out blubblub
  Memo1.Lines.Add('FormVar1.Name' + ' : ' + FormVar1.Name); //out = ''
  Memo1.Lines.Add('globalVar1.Name' + ' : ' + globalVar1.Name); //out = ''

end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  TestX;
end;

end.
  Mit Zitat antworten Zitat