動的配列を含むレコードがあります。ある配列変数を別の配列変数に割り当てる場合、実際にはその配列へのポインターのみが割り当てられるのが普通です。つまり、これを行うと、一方のサイズを変更するまで、両方の変数が同じ配列を指します。したがって、配列の別のコピーを変数に割り当てたい場合は、Copy()関数を使用します。
ただし、この場合、私の配列はレコードのフィールドです。
TMyRec = record
Value: integer;
&Array: array of integer;
end;
タイプTMyRecの2つの変数を宣言してから、一方を他方に割り当てると、両方のレコードの「配列」フィールドがメモリ内の同じアドレスを指します。
この種の問題を解決するために、次のように割り当て演算子をオーバーロードすることにしました。
TMyRec = record
Value: integer;
&Array: array of integer;
public
class operator Implicit(Value: TMyRec): TMyRec;
end;
class operator TMyRec.Implicit(Value: TMyRec): TMyRec;
begin
Result := Value;
Result.&Array := Copy(Value.&Array);
end;
これが機能する場合、TMyRecord変数を相互に割り当てた後、レコード内のすべての配列フィールドを個別にコピーする必要はありません。
これが私がすることです:
var
Rec1, Rec2: TMyRec;
begin
Rec1.Value := 10;
SetLength(Rec1.Array, 1);
//I expected the "Implicit" method to be invoked here (but it is not...)
Rec2 := Rec1;
//if I do that, the Rec1.Array[0] will also be changed to 1 - I don't want that to happen
Rec2.Array[0] := 1;
end;
演算子のオーバーロードを希望どおりに機能させる方法はありますか?問題は、デフォルトの代入演算子をオーバーロードしようとしていることです。それは不可能ですか?