1

ちょっとした問題に直面しました - 自分のクラスに独自の演算子を定義できるかどうかわかりません。例えば:

type
  TMinMatrix = class(TMatrix)
    private
      RowAmount: Byte;
      ColAmount: Byte;
      Data: DataMatrix;
      DemVector, SupVector: SupplyDemand;
    public
      constructor Create(Rows, Cols: Byte);
      function GetRowAmount: Byte; override;
      function GetColAmount: Byte; override;
      destructor Destroy;
  end;

どうすればいいですか - またはできません:) - 次のようなことをします:

TMinMatrix TMinMatrix::operator=(TMinMatrix* matr)    (c++ code)

ところで、自分のクラスにコピー コンストラクターを定義できますか?

4

8 に答える 8

5

Delphi Win32 2007 および 2009 は、レコードのクラス演算子のオーバーロードのみをサポートします。暗黙的および明示的な演算子を使用できます。Delphi .Net は、レコードとクラスのクラス演算子をサポートしています。

于 2008-11-30T21:30:32.617 に答える
3

Delphi .NET バージョンでは演算子のオーバーロードが可能ですが、古いバージョンの Delphi ではサポートされていません。

于 2008-11-30T21:19:29.317 に答える
2
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: タイプ; b: タイプ): resultType; +   
Subtract Binary Subtract(a: タイプ; b: タイプ) : resultType; -   
Multiply Binary Multiply(a: タイプ; b: タイプ) : resultType; *   
Divide Binary Divide(a: 型; b: 型) : resultType; /
IntDivide Binary IntDivide(a: タイプ; b: タイプ): resultType; 分周   
Modulus Binary Modulus(a: タイプ; b: タイプ): resultType; モッド   
LeftShift Binary LeftShift(a: タイプ; b: タイプ): resultType; シェル   
RightShift Binary RightShift(a: タイプ; b: タイプ): resultType; シュル   
LogicalAnd Binary LogicalAnd(a: タイプ; b: タイプ): resultType; と   
LogicalOr Binary LogicalOr(a: タイプ; b: タイプ): resultType; また   
LogicalXor Binary LogicalXor(a: タイプ; b: タイプ): resultType; xor   
BitwiseAnd Binary BitwiseAnd(a: タイプ; b: タイプ): resultType; と   
BitwiseOr Binary BitwiseOr(a: タイプ; b: タイプ): resultType; また   
BitwiseXor Binary BitwiseXor(a: タイプ; b: タイプ): resultType; xor   

;)

于 2009-09-05T23:10:13.100 に答える
2

Delphi でクラスをコピーする「従来の」方法は、TPersistant の「AssignTo」メソッドをオーバーライドすることです。これは通常、次の形式をとります。

TSubclass(Dest).Field1 := Field1;
TSubclass(Dest).Field2 := Field2;

これは少し苦痛です。

次に、CreateCopy コンストラクターがこのメソッドを呼び出します。

constructor CreateCopy(ASource : TMyClass);
begin
  Create;
  Assign(ASource); // calls AssignTo
end;

Delphi の新しい(2006 年に機能する)バージョンのもう 1 つのトリックは、レコード タイプを使用してフィールドを格納することです。

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() を更新することを覚えておく必要はありません)。

于 2008-12-01T02:55:48.060 に答える
1

Drejc と Cesar が言ったことは何でも + Delphi Win32 2007 と 2009 は、私の知る限り、コピー コンストラクターをサポートしていません (D2007 については 100% ですが、D2009 については完全にはわかりません)。

于 2008-11-30T21:51:17.927 に答える
1

Delphi Win32 での演算子のオーバーロードは、レコードに対してのみ機能し、クラスに対しては機能しません。

これは Delphi 2006 以降で動作しますが、Delphi 2007 でいくつかのバグが修正されたため、操作が簡単になりました (演算子の結果に対する関数の呼び出しに関係しています)。

CodeRage 3 でレコード オペレーターのオーバーロードに関するセッションを行いました。スライドとサンプル コードは26326 CR3: Nullable Types w/ Records, Methods & Operator Overloadingで入手できます。また、ビデオ リプレイはDOWNLOAD VIDEO REPLAYで見ることができます。

これはセッションの要約でした:

レコード、メソッド、および演算子のオーバーロードによる Null 許容型 データベースからのデータと Delphi ネイティブ型が異なる点の 1 つは、NULL のサポートです。Delphi でデータベースを頻繁に扱う場合、NULL をサポートするデータ型が必要になります。以前はバリアントを使用する必要がありましたが、今はそうではありません! 演算子のオーバーロードの導入により、レコード型でもこれを行うことができます。このセッションでは、その方法を示します。

演算子のオーバーロードが Delphi Win32 (つまり .NET 以外) のレコードに対してのみ可能である理由は、レコードが値型であるため、メモリ管理が動的ではないためです。クラスは参照型であるため、動的メモリ割り当てが必要です。オペレーターがクラスを操作するには、ガベージ コレクターの概念が必要です。

Delphi Win32 にはガベージ コレクタの概念がないため、Delphi Win32 でクラスの演算子を使用することはできません。

CodeRage 4が来週から始まることに注意してください。スピーカーとセッションの素晴らしいラインナップがあります。

于 2009-09-06T15:33:37.290 に答える
0

コピーコンストラクターはイディオムであり、言語機能ではないと思います。
したがって、次のようにすることができます:
constructor CreateCopy(var t: MyType);

コンストラクタ MyType.CreateCopy(var t: MyType);
開始
//...
終了;

于 2008-12-01T01:21:39.623 に答える
0

Delphi では、レコード宣言内で特定の関数または演算子をオーバーロードできます。ここで確認できます: http://edn.embarcadero.com/article/34324

于 2010-03-17T13:12:48.407 に答える