6

動的配列を使用するタイプのレコードを作成したい。

このタイプの変数 A と B を使用して、操作 A: = B (およびその他) を実行できるようにし、以下の抜粋されたコードのように B を変更せずに A の内容を変更できるようにしたいと考えています。

    type
      TMyRec = record
        Inner_Array: array of double;
      public
        procedure SetSize(n: integer);
        class operator Implicit(source: TMyRec): TMyRec;
      end;

    implementation

    procedure TMyRec.SetSize(n: integer);
    begin
      SetLength(Inner_Array, n);
    end;

    class operator TMyRec.Implicit(source: TMyRec): TMyRec;
    begin
    //here I want to copy data from source to destination (A to B in my simple example below)
    //but here is the compilator error
    //[DCC Error] : E2521 Operator 'Implicit' must take one 'TMyRec' type in parameter or result type
    end;


    var
      A, B: TMyRec;
    begin
      A.SetSize(2);
      A.Inner_Array[1] := 1;
      B := A;
      A.Inner_Array[1] := 0;
//here are the same values inside A and B (they pointed the same inner memory)

2 つの問題があります。

  1. TMyRec でオーバーライド代入演算子を使用しない場合、A:=B は A と B (それらの Inner_Array) がメモリ内の同じ場所を指していることを意味します。
  2. 問題を回避するために1)次を使用して割り当て演算子をオーバーロードしたい:

    クラス演算子 TMyRec.Implicit(ソース: TMyRec): TMyRec;

しかし、コンパイラ(Delphi XE)は次のように述べています。

[DCC エラー] : E2521 演算子 'Implicit' は、パラメーターまたは結果の型で 1 つの 'TMyRec' 型を取る必要があります

この問題を解決する方法。私はstackoverflowでいくつかの同様の投稿を読みましたが、私の状況では(よく理解していれば)機能しません。

アートク

4

2 に答える 2

5

代入演算子をオーバーロードすることはできません。これは、あなたがしようとしていることは不可能であることを意味します。


編集: 今は可能です - http://docwiki.embarcadero.com/RADStudio/Sydney/en/Custom_Managed_Records#The_Assign_Operator

于 2013-07-31T20:14:05.183 に答える