gpt4 book ai didi

delphi - F2047 循环单位给定

转载 作者:行者123 更新时间:2023-12-03 18:23:55 24 4
gpt4 key购买 nike

我在运算符(operator)重载的情况下工作,我有这种情况,从一边:

unit _TIns;

interface

uses
_TExtract;

type
TIns = record
private type
TInsArray = array [1..90] of Boolean;
var
FInsArray: TInsArray;
public
class operator Implicit(const Value: TExtract): TIns;
class operator Implicit(const Value: TIns): TExtract;
end;

implementation
// Code
end.

并且,从另一边:
unit _TExtract;

interface

uses
_TIns;

type
TExtract = record
private type
TExtractEnum = 1 .. 90;
var
FExtractEnum: TExtractEnum;
public
class operator Implicit(const Value: Integer): TExtract;
class operator Implicit(const Value: TExtract): Integer;
class operator In(A: TExtract; B: TIns) : Boolean;
end;

implementation
// Code
end.

当然,我已经了解问题出在哪里,并且两个单元都调用了另一个单元。但还没有理解为解决它。如果我尝试在同一单元中定义它,则第一个 TExtract 找不到 TIns,否则 TIns 找不到 TExtract。
只有在不存在解决方案的情况下,我才能删除依赖项并解决此问题,但我会对两者都使用此数据类型。
非常感谢大家的帮助,祝大家新年快乐。

最佳答案

您有两个循环引用问题。首先,您要声明两个单元,每个单元在接口(interface)部分中引用另一个单元。这可以通过多种方式解决。现在,我现在将忽略这个问题并专注于其他循环引用问题。为此,我将假设所有代码都出现在同一个单元中。

更紧迫的循环引用问题是 TInsTExtract反之亦然。为了打破这种特殊的循环,您需要引入前向引用,就像通常对类所做的那样。但事实证明,无法对 record 进行前向引用。类型。

虽然类类型可以进行前向引用,但类类型和记录类型之间存在根本区别。记录类型是值类型,类类型是引用类型。 Delphi 编译器的当前实现不支持值类型的前向引用。

您的问题的解决方案是将引用这两种类型的运算符移动到最后声明的记录。例如:

TIns = record
private type
TInsArray = array [1..90] of Boolean;
var
FInsArray: TInsArray;
end;

TExtract = record
private type
TExtractEnum = 1 .. 90;
var
FExtractEnum: TExtractEnum;
public
class operator Implicit(const Value: TExtract): TIns;
class operator Implicit(const Value: TIns): TExtract;
class operator Implicit(const Value: Integer): TExtract;
class operator Implicit(const Value: TExtract): Integer;
class operator In(A: TExtract; B: TIns) : Boolean;
end;

如果您希望保留两个单独的单元,请执行以下操作:
  • TIns在单位_TIns .
  • 不是 使用 _TExtract来自 _TIns .
  • TExtract在单位_TExtract .
  • 使用_TIns来自_TExtract的接口(interface)部分.

  • 像这样:
    unit _TIns;

    interface

    type
    TIns = record
    private type
    TInsArray = array [1..90] of Boolean;
    var
    FInsArray: TInsArray;
    end;

    implementation

    end.
    unit _TExtract;

    interface

    uses
    _TIns;

    type
    TExtract = record
    private type
    TExtractEnum = 1 .. 90;
    var
    FExtractEnum: TExtractEnum;
    public
    class operator Implicit(const Value: TExtract): TIns;
    class operator Implicit(const Value: TIns): TExtract;
    class operator Implicit(const Value: Integer): TExtract;
    class operator Implicit(const Value: TExtract): Integer;
    class operator In(A: TExtract; B: TIns) : Boolean;
    end;

    implementation
    // Code
    end.

    关于delphi - F2047 循环单位给定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8644014/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com