我正在使用运算符的重载,我有这种情况,有一个方面:
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,否则TI不能找到TExtract。 我可以删除依赖和解决所以,只有当不存在解决方案,但我会使用这两种数据类型。 非常感谢所有人的帮助和新的一年。
答案 0 :(得分: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;
如果你想保留两个单独的单位,那么就这样做:
TIns
放入单位_TIns
。_TExtract
中的_TIns
。 TExtract
放入单位_TExtract
。_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.