2011-12-27 136 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