14

私は Delphi 2006 でレコードのオーバーロード演算子を使用しています。

暗黙の演算子がオーバーロードされた 2 つのレコード型があります。どちらもモジュールの実装のみであり、インターフェースを通じて公開されません。

私の問題は、それらが相互に依存しているため、2 番目の型をコンパイラに宣言する方法がわからないことです。関数、プロシージャ、およびクラスでこれを行う方法は知っていますが、レコードについては知りません。

これは私がやろうとしていることの簡単な例です:

implementation

type
  TMyRec1 = record
    Field1 : Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;  // <---- Undeclared Identifier here.
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

class operator TMyRec1.Implicit(a:TMyRec2): TMyRec1;
begin
  Result.Field1 := a.Field2;
end;

class operator TMyRec2.Implicit(a:TMyRec2): TMyRec2;
begin
  Result.Field2 := a.Field1;
end;
4

2 に答える 2

14

レコードタイプの前方宣言はできません。Implicit2番目のタイプで両方の演算子を定義します。

type
  TMyRec1 = record
    Field1 : Integer;
  end;

  TMyRec2 = record
    Field2: Integer;
    class operator Implicit(a: TMyRec2): TMyRec1;
    class operator Implicit(a: TMyRec1): TMyRec2;
  end;

ヘルプからの引用:

暗黙の変換は、絶対に必要な場合にのみ提供する必要があり、再帰性は回避する必要があります。タイプBが暗黙的にタイプAに変換し、タイプAがタイプBの知識を持たないようにする(またはその逆)のが最善です。

于 2009-04-21T02:42:50.443 に答える
3

これは、レコード ヘルパーを使用して実行できる場合があります

forward record以下は、レコード宣言を持つことが不可能であるという問題を回避するために私が最近行ったことです。

それはrecord helper- 同様にimplicit type casts- 欠点もある構造を使用します。
最も重要なのrecord helperは、特定のrecordタイプに最も近いものだけが適用されるということです。

type
  TIpv4Address = record
  strict private
    FAddress: TIpv4Quad;
    FMask: TIpv4Quad;
  private
    class function CreateInternal(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
  public
    class function Create(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4Address; static;
    class function Count(const IP_ADDR_STRING: _IP_ADDR_STRING): Integer; static;
    property Address: TIpv4Quad read FAddress;
    property Mask: TIpv4Quad read FMask;
  end;

  TIpv4AddressList = array of TIpv4Address;

  TIpv4AddressHelper = record helper for TIpv4Address
    class function CreateList(const IP_ADDR_STRING: _IP_ADDR_STRING): TIpv4AddressList; static;
  end;

次のように使用します。

function TAdapterInfo.GetIpAddressList: TIpv4AddressList;
begin
  Result := TIpv4Address.CreateList(AdapterInfos.IP_ADAPTER_INFO[Index].IpAddressList);
end;

--jeroen

于 2011-01-15T20:53:57.533 に答える