2011-12-27 73 views
2

i相操作的超负荷工作,我有这种情况,FRA侧:F2047循环单元参考

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。 我可以删除依赖项,只有在不存在解决方案的情况下解决,但我会为这两种情况使用这种数据类型。 非常感谢各位的帮助和新年。

+0

这可能有助于 [计算器] [1] [1]:HTTP://计算器。 com/questions/1284959/how-to-avoid-circular-unit-reference – PresleyDias 2011-12-27 11:22:26

回答

5

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

更紧迫的循环参考问题是TIns指的是TExtract,反之亦然。为了打破这个特定的循环,你需要引入一个前向引用,就像通常对类所做的那样。但事实证明,前向引用不能用于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; 

如果您想保留两个独立的单元,然后像这样做:

  1. TIns在单位_TIns
  2. 不是使用_TExtract_TIns
  3. TExtract放在单位_TExtract
  4. 使用_TIns_TExtract的接口部分。

像这样:

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. 
+0

了解,那么我应该在_TIns实现中复制_TExtract实现的代码来解决它,而不是调用_TExtract。好的,非常感谢。 – 2011-12-27 11:28:31

+0

我记得问题的解决方案是什么,并将其添加到答案中。 – 2011-12-27 12:19:41

+0

问题是两个操作员都打电话给其他人。所以我需要这样做,因为没有这么叫单位,对吗? – 2011-12-27 12:40:01