14

我在 Delphi 2006 中对记录使用运算符重载。(请不要告诉我不要回答这个问题。)

我有两种记录类型,其中隐式运算符重载。它们都只在模块的实现中,不通过接口暴露。

我的问题是,既然它们是相互依赖的,我不知道如何将第二种类型的声明转发给编译器。我知道如何处理函数、过程和类,但不知道如何处理记录。

这是我正在尝试做的一个简化示例:

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

您不能有记录类型的前向声明。Implicit在第二种类型中定义两个运算符:

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;

——杰伦

于 2011-01-15T20:53:57.533 回答