我可以在Delphi中为自己的类重载运算符吗?
我遇到了一个小麻烦——我不知道是否可以为我的类定义自己的操作符。 例如: 我怎么能——或者说我不能:——做像这样的事情:我可以在Delphi中为自己的类重载运算符吗?,delphi,oop,operators,Delphi,Oop,Operators,我遇到了一个小麻烦——我不知道是否可以为我的类定义自己的操作符。 例如: 我怎么能——或者说我不能:——做像这样的事情: TMinMatrix TMinMatrix::operator=(TMinMatrix* matr) (c++ code) 顺便问一下,我可以为我的类定义复制构造函数吗?运算符重载在Delphi.NET版本中是可能的,Delphi的旧版本不支持它。运算符重载在Delphi.NET版本中是可能的,旧版本的Delphi不支持它。Delphi Win32 2007和2009
TMinMatrix TMinMatrix::operator=(TMinMatrix* matr) (c++ code)
顺便问一下,我可以为我的类定义复制构造函数吗?运算符重载在Delphi.NET版本中是可能的,Delphi的旧版本不支持它。运算符重载在Delphi.NET版本中是可能的,旧版本的Delphi不支持它。Delphi Win32 2007和2009仅支持记录的类运算符重载,您可以使用隐式和显式运算符。
Delphi.Net支持记录和类的类运算符。Delphi Win32 2007和2009仅支持记录的类运算符重载,您可以使用隐式和显式运算符。
Delphi.Net支持记录和类的类运算符。无论Drejc和Cesar说什么+Delphi Win32 2007和2009都不支持复制构造函数,据我所知,我100%支持D2007,不完全确定D2009。不管Drejc和Cesar说什么+Delphi Win32 2007和2009都不支持复制构造函数,据我所知,我100%支持D2007,不完全确定D2009。我想复制构造函数是一种习惯用法,而不是一种语言特性。 所以我可以这样做: 构造函数CreateCopyvar t:MyType 构造函数MyType.CreateCopyvar t:MyType; 开始 //...
结束 我认为复制构造函数是一种习惯用法,而不是一种语言特性。 所以我可以这样做: 构造函数CreateCopyvar t:MyType 构造函数MyType.CreateCopyvar t:MyType; 开始 //...
结束 Delphi中复制类的传统方法是重写TPersistant的AssignTo方法。这通常采取以下形式:
TSubclass(Dest).Field1 := Field1;
TSubclass(Dest).Field2 := Field2;
这有点痛
然后,CreateCopy构造函数将调用此方法:
constructor CreateCopy(ASource : TMyClass);
begin
Create;
Assign(ASource); // calls AssignTo
end;
在2006年版本的Delphi的后续工作中,另一个技巧是使用记录类型来存储字段
class TMyClass = class(TPersistent)
protected
type // 2005+ only, otherwise use standalone record
TMyRecord = record
Name : string;
ID : integer;
end;
FData : TMyRecord;
procedure AssignTo(Dest : TPersistent);override;
public
property Name : string read FData.Name;
property ID: Integer read FData.ID;
end;
procedure TMyClass.AssignTo(Dest : TPersistent);
begin
if Dest is TMyClass then
TMyClass(Dest).FData := FData
else
inherited; // raise EConvertError
end;
如果您一直在子类中添加字段,这会变得很混乱-需要添加新的记录类型,但它会自动处理添加到TMyrecord中的新字段不必记住更新AssignTo在Delphi中复制类的传统方法是重写TPersistant的AssignTo方法。这通常采取以下形式:
TSubclass(Dest).Field1 := Field1;
TSubclass(Dest).Field2 := Field2;
type
TMinMatrix = class(TMatrix)
public
A : integer;
class operator Add( ATM, BTM : TMinMatrix ) : TMinMatrix;
// CTM := ATM + BTM
class operator Subtract( ATM, BTM : TMinMatrix ) : TMinMatrix;
// CTM := ATM - BTM;
end;
class operator TMinMatrix.Add( ATM, BTM : TMinMatrix ) : TMinMatrix;
begin
result := ATM.A + BTM.A;
end;
class operator TMinMatrix.Subtract( ATM, BTM : TMinMatrix ) : TMinMatrix;
begin
result := ATM.A - BTM.A;
end;
var
A, B, C : TMinMatrix;
begin
C := A + B; // calls Add()
C := B - A; // calls Subtract()
end.
这有点痛
然后,CreateCopy构造函数将调用此方法:
constructor CreateCopy(ASource : TMyClass);
begin
Create;
Assign(ASource); // calls AssignTo
end;
在2006年版本的Delphi的后续工作中,另一个技巧是使用记录类型来存储字段
class TMyClass = class(TPersistent)
protected
type // 2005+ only, otherwise use standalone record
TMyRecord = record
Name : string;
ID : integer;
end;
FData : TMyRecord;
procedure AssignTo(Dest : TPersistent);override;
public
property Name : string read FData.Name;
property ID: Integer read FData.ID;
end;
procedure TMyClass.AssignTo(Dest : TPersistent);
begin
if Dest is TMyClass then
TMyClass(Dest).FData := FData
else
inherited; // raise EConvertError
end;
如果您一直在子类中添加字段,这会变得很混乱-需要添加新的记录类型,但它会自动处理添加到TMyrecord中的新字段,而不必记住更新AssignTo
type
TMinMatrix = class(TMatrix)
public
A : integer;
class operator Add( ATM, BTM : TMinMatrix ) : TMinMatrix;
// CTM := ATM + BTM
class operator Subtract( ATM, BTM : TMinMatrix ) : TMinMatrix;
// CTM := ATM - BTM;
end;
class operator TMinMatrix.Add( ATM, BTM : TMinMatrix ) : TMinMatrix;
begin
result := ATM.A + BTM.A;
end;
class operator TMinMatrix.Subtract( ATM, BTM : TMinMatrix ) : TMinMatrix;
begin
result := ATM.A - BTM.A;
end;
var
A, B, C : TMinMatrix;
begin
C := A + B; // calls Add()
C := B - A; // calls Subtract()
end.
其他营办商包括:
Add Binary Add(a: type; b: type): resultType; +
Subtract Binary Subtract(a: type; b: type) : resultType; -
Multiply Binary Multiply(a: type; b: type) : resultType; *
Divide Binary Divide(a: type; b: type) : resultType; /
IntDivide Binary IntDivide(a: type; b: type): resultType; div
Modulus Binary Modulus(a: type; b: type): resultType; mod
LeftShift Binary LeftShift(a: type; b: type): resultType; shl
RightShift Binary RightShift(a: type; b: type): resultType; shr
LogicalAnd Binary LogicalAnd(a: type; b: type): resultType; and
LogicalOr Binary LogicalOr(a: type; b: type): resultType; or
LogicalXor Binary LogicalXor(a: type; b: type): resultType; xor
BitwiseAnd Binary BitwiseAnd(a: type; b: type): resultType; and
BitwiseOr Binary BitwiseOr(a: type; b: type): resultType; or
BitwiseXor Binary BitwiseXor(a: type; b: type): resultType; xor
)
其他营办商包括:
Add Binary Add(a: type; b: type): resultType; +
Subtract Binary Subtract(a: type; b: type) : resultType; -
Multiply Binary Multiply(a: type; b: type) : resultType; *
Divide Binary Divide(a: type; b: type) : resultType; /
IntDivide Binary IntDivide(a: type; b: type): resultType; div
Modulus Binary Modulus(a: type; b: type): resultType; mod
LeftShift Binary LeftShift(a: type; b: type): resultType; shl
RightShift Binary RightShift(a: type; b: type): resultType; shr
LogicalAnd Binary LogicalAnd(a: type; b: type): resultType; and
LogicalOr Binary LogicalOr(a: type; b: type): resultType; or
LogicalXor Binary LogicalXor(a: type; b: type): resultType; xor
BitwiseAnd Binary BitwiseAnd(a: type; b: type): resultType; and
BitwiseOr Binary BitwiseOr(a: type; b: type): resultType; or
BitwiseXor Binary BitwiseXor(a: type; b: type): resultType; xor
) Delphi Win32中的运算符重载仅适用于记录,不适用于类 它可以在Delphi2006及更高版本中使用,但Delphi2007中修复了一些bug,使它们更容易处理对运算符结果调用函数的问题 我在CodeRage 3上做了一个关于记录操作符重载的会议;您可以在获取幻灯片和示例代码,和/或在观看视频回放 这是会议摘要: 具有记录、方法的可空类型 和运算符重载其中一个 从数据库和 Delphi本机类型不同,是 支持NULL。当你与 在Delphi中有很多数据库,你想 具有支持NULL的数据类型。在里面 过去你必须使用变体,但是 不再是了!随着 运算符重载,您可以这样做 还有记录类型。本届会议 告诉你怎么做 运算符重载仅适用于Delphi Win32(即非.NET)中的记录,原因是记录是值类型,因此它们的内存管理是非动态的。类是引用类型,因此需要动态内存分配:它们需要垃圾收集器的概念,以便操作员处理它们 由于Delphi Win32中没有垃圾收集器的概念,因此在Delphi Win32中不可能有类的运算符
请注意,从下周开始。它有一系列很好的演讲者和会话。Delphi Win32中的运算符重载仅适用于记录,不适用于类 它可以在Delphi2006及更高版本中使用,但Delphi2007中修复了一些bug,使它们更容易处理对运算符结果调用函数的问题 我在CodeRage 3上做了一个关于记录操作符重载的会议;您可以在获取幻灯片和示例代码,和/或在观看视频回放 这是会议摘要: 具有记录、方法的可空类型 和运算符重载其中一个 从数据库和 Delphi本机类型不同,是 支持NULL。当你与 在Delphi中有很多数据库,你想 具有支持NULL的数据类型。在里面 过去你必须使用vari 蚂蚁,但是 不再是了!随着 运算符重载,您可以这样做 还有记录类型。本届会议 告诉你怎么做 运算符重载仅适用于Delphi Win32(即非.NET)中的记录,原因是记录是值类型,因此它们的内存管理是非动态的。类是引用类型,因此需要动态内存分配:它们需要垃圾收集器的概念,以便操作员处理它们 由于Delphi Win32中没有垃圾收集器的概念,因此在Delphi Win32中不可能有类的运算符
请注意,从下周开始。它有一系列很好的演讲者和会话。Delphi允许在记录声明中重载某些函数或运算符。您可以在这里看到:Delphi允许在记录声明中重载某些函数或运算符。您可以在这里看到:请更具体一些-Delphi for Win32还是.NET?哪个Delphi版本?请更具体一点-Delphi适用于Win32还是.NET?哪一个Delphi版本?Delphi Win32 2007和更新版本的记录中肯定可能存在运算符重载。但不是针对类,这是正确的。在Delphi Win32 2007和更新版本的记录中,运算符重载当然是可能的。但不是针对类,这是正确的。Delphi更喜欢使用Assign。但是复制构造函数也可以做到这一点,它更喜欢使用赋值。但是复制构造函数也可以做到这一点。