Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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中为自己的类重载运算符吗?_Delphi_Oop_Operators - Fatal编程技术网

我可以在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。但是复制构造函数也可以做到这一点,它更喜欢使用赋值。但是复制构造函数也可以做到这一点。