Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi F2047循环单位参考_Delphi_Delphi Xe2 - Fatal编程技术网

Delphi F2047循环单位参考

Delphi F2047循环单位参考,delphi,delphi-xe2,Delphi,Delphi Xe2,我在操作员过载的情况下工作,我有这种情况,fra a a侧: 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;

我在操作员过载的情况下工作,我有这种情况,fra a a侧:

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。 只有在不存在解决方案的情况下,我才能删除依赖项并进行求解,但我会将此数据类型用于这两种情况。
非常感谢你们的帮助,祝大家新年快乐

您有两个循环参考问题。首先,您要声明两个单元,每个单元在接口部分中相互引用。这可以通过多种方式解决。现在,我将忽略这个问题,集中讨论另一个循环引用问题。为了做到这一点,我将假设所有代码都出现在同一个单元中

更紧迫的循环引用问题是TIN引用TExtract,反之亦然。为了打破这种特殊的循环,您需要引入一个前向引用,就像通常对类所做的那样。但事实证明,不能对记录类型进行正向引用

虽然类类型可以进行正向引用,但类类型和记录类型之间存在根本区别。记录类型是值类型,类类型是引用类型。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的文本摘要。 将TExtract放入单元中。 使用_TExtract接口部分的_TIns。 像这样:

unit _TIns;

interface

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

implementation

end.

这可能有助于[stackoverflow][1][1]:理解,那么我应该复制\u TExtract implemantation在\u TIns实现中的代码来解决它,而不是调用\u TExtract。好的,非常感谢。我已经记住了问题的解决方案,并将其添加到了答案中。问题是两个接线员都打电话给对方。所以我需要在没有呼叫装置的情况下为两个都做,对吗?我不理解那个评论。我想我的最新更新完全解决了你所有的问题,有什么解释吗?我做错什么了吗。很高兴知道。
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.